Bundle ClientProxy & MediaProvider injections together in UserSession.

This commit is contained in:
Doug
2025-08-27 17:25:28 +01:00
committed by Doug
parent b34816e159
commit f67f826bb7
74 changed files with 315 additions and 499 deletions
@@ -723,8 +723,7 @@ class ChatsFlowCoordinator: FlowCoordinatorProtocol {
// MARK: Room Directory Search // MARK: Room Directory Search
private func presentRoomDirectorySearch() { private func presentRoomDirectorySearch() {
let coordinator = RoomDirectorySearchScreenCoordinator(parameters: .init(clientProxy: userSession.clientProxy, let coordinator = RoomDirectorySearchScreenCoordinator(parameters: .init(userSession: userSession,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController)) userIndicatorController: flowParameters.userIndicatorController))
coordinator.actionsPublisher.sink { [weak self] action in coordinator.actionsPublisher.sink { [weak self] action in
@@ -758,8 +757,7 @@ class ChatsFlowCoordinator: FlowCoordinatorProtocol {
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let parameters = UserProfileScreenCoordinatorParameters(userID: userID, let parameters = UserProfileScreenCoordinatorParameters(userID: userID,
isPresentedModally: true, isPresentedModally: true,
clientProxy: userSession.clientProxy, userSession: userSession,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
analytics: flowParameters.analytics) analytics: flowParameters.analytics)
let coordinator = UserProfileScreenCoordinator(parameters: parameters) let coordinator = UserProfileScreenCoordinator(parameters: parameters)
@@ -791,9 +789,8 @@ class ChatsFlowCoordinator: FlowCoordinatorProtocol {
let stackCoordinator = NavigationStackCoordinator() let stackCoordinator = NavigationStackCoordinator()
let coordinator = RoomSelectionScreenCoordinator(parameters: .init(clientProxy: userSession.clientProxy, let coordinator = RoomSelectionScreenCoordinator(parameters: .init(userSession: userSession,
roomSummaryProvider: roomSummaryProvider, roomSummaryProvider: roomSummaryProvider))
mediaProvider: userSession.mediaProvider))
coordinator.actionsPublisher.sink { [weak self] action in coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return } guard let self else { return }
@@ -77,7 +77,7 @@ class MediaEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
let parameters = MediaEventsTimelineScreenCoordinatorParameters(roomProxy: roomProxy, let parameters = MediaEventsTimelineScreenCoordinatorParameters(roomProxy: roomProxy,
mediaTimelineController: mediaTimelineController, mediaTimelineController: mediaTimelineController,
filesTimelineController: filesTimelineController, filesTimelineController: filesTimelineController,
mediaProvider: userSession.mediaProvider, userSession: userSession,
mediaPlayerProvider: MediaPlayerProvider(), mediaPlayerProvider: MediaPlayerProvider(),
voiceMessageMediaManager: userSession.voiceMessageMediaManager, voiceMessageMediaManager: userSession.voiceMessageMediaManager,
appMediator: flowParameters.appMediator, appMediator: flowParameters.appMediator,
@@ -85,8 +85,7 @@ class MediaEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
analytics: flowParameters.analytics, analytics: flowParameters.analytics,
emojiProvider: flowParameters.emojiProvider, emojiProvider: flowParameters.emojiProvider,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
timelineControllerFactory: flowParameters.timelineControllerFactory, timelineControllerFactory: flowParameters.timelineControllerFactory)
clientProxy: userSession.clientProxy)
let coordinator = MediaEventsTimelineScreenCoordinator(parameters: parameters) let coordinator = MediaEventsTimelineScreenCoordinator(parameters: parameters)
@@ -63,7 +63,7 @@ class PinnedEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
let coordinator = PinnedEventsTimelineScreenCoordinator(parameters: .init(roomProxy: roomProxy, let coordinator = PinnedEventsTimelineScreenCoordinator(parameters: .init(roomProxy: roomProxy,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: userSession.mediaProvider, userSession: userSession,
mediaPlayerProvider: MediaPlayerProvider(), mediaPlayerProvider: MediaPlayerProvider(),
voiceMessageMediaManager: userSession.voiceMessageMediaManager, voiceMessageMediaManager: userSession.voiceMessageMediaManager,
appMediator: flowParameters.appMediator, appMediator: flowParameters.appMediator,
@@ -71,7 +71,6 @@ class PinnedEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
analytics: flowParameters.analytics, analytics: flowParameters.analytics,
emojiProvider: flowParameters.emojiProvider, emojiProvider: flowParameters.emojiProvider,
timelineControllerFactory: flowParameters.timelineControllerFactory, timelineControllerFactory: flowParameters.timelineControllerFactory,
clientProxy: userSession.clientProxy,
userIndicatorController: flowParameters.userIndicatorController)) userIndicatorController: flowParameters.userIndicatorController))
coordinator.actions coordinator.actions
@@ -127,9 +126,8 @@ class PinnedEventsTimelineFlowCoordinator: FlowCoordinatorProtocol {
let stackCoordinator = NavigationStackCoordinator() let stackCoordinator = NavigationStackCoordinator()
let parameters = MessageForwardingScreenCoordinatorParameters(forwardingItem: forwardingItem, let parameters = MessageForwardingScreenCoordinatorParameters(forwardingItem: forwardingItem,
clientProxy: userSession.clientProxy, userSession: userSession,
roomSummaryProvider: roomSummaryProvider, roomSummaryProvider: roomSummaryProvider,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController) userIndicatorController: flowParameters.userIndicatorController)
let coordinator = MessageForwardingScreenCoordinator(parameters: parameters) let coordinator = MessageForwardingScreenCoordinator(parameters: parameters)
@@ -544,12 +544,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
timelineItemfactory: timelineItemFactory, timelineItemfactory: timelineItemFactory,
threadRootEventID: nil) threadRootEventID: nil)
let parameters = RoomScreenCoordinatorParameters(clientProxy: userSession.clientProxy, let parameters = RoomScreenCoordinatorParameters(userSession: userSession,
roomProxy: roomProxy, roomProxy: roomProxy,
focussedEvent: presentationAction?.focusedEvent, focussedEvent: presentationAction?.focusedEvent,
sharedText: presentationAction?.sharedText, sharedText: presentationAction?.sharedText,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: userSession.mediaProvider,
mediaPlayerProvider: MediaPlayerProvider(), mediaPlayerProvider: MediaPlayerProvider(),
voiceMessageMediaManager: userSession.voiceMessageMediaManager, voiceMessageMediaManager: userSession.voiceMessageMediaManager,
emojiProvider: flowParameters.emojiProvider, emojiProvider: flowParameters.emojiProvider,
@@ -644,10 +643,9 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
timelineItemfactory: timelineItemFactory, timelineItemfactory: timelineItemFactory,
threadRootEventID: threadRootEventID) threadRootEventID: threadRootEventID)
let coordinator = ThreadTimelineScreenCoordinator(parameters: .init(clientProxy: userSession.clientProxy, let coordinator = ThreadTimelineScreenCoordinator(parameters: .init(userSession: userSession,
roomProxy: roomProxy, roomProxy: roomProxy,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: userSession.mediaProvider,
mediaPlayerProvider: MediaPlayerProvider(), mediaPlayerProvider: MediaPlayerProvider(),
voiceMessageMediaManager: userSession.voiceMessageMediaManager, voiceMessageMediaManager: userSession.voiceMessageMediaManager,
emojiProvider: flowParameters.emojiProvider, emojiProvider: flowParameters.emojiProvider,
@@ -703,8 +701,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
private func presentJoinRoomScreen(via: [String], animated: Bool) { private func presentJoinRoomScreen(via: [String], animated: Bool) {
let coordinator = JoinRoomScreenCoordinator(parameters: .init(roomID: roomID, let coordinator = JoinRoomScreenCoordinator(parameters: .init(roomID: roomID,
via: via, via: via,
clientProxy: userSession.clientProxy, userSession: userSession,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
appSettings: flowParameters.appSettings)) appSettings: flowParameters.appSettings))
@@ -777,8 +774,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
private func presentRoomDetails(isRoot: Bool, animated: Bool) async { private func presentRoomDetails(isRoot: Bool, animated: Bool) async {
let params = RoomDetailsScreenCoordinatorParameters(roomProxy: roomProxy, let params = RoomDetailsScreenCoordinatorParameters(roomProxy: roomProxy,
clientProxy: userSession.clientProxy, userSession: userSession,
mediaProvider: userSession.mediaProvider,
analyticsService: flowParameters.analytics, analyticsService: flowParameters.analytics,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
notificationSettings: userSession.clientProxy.notificationSettings, notificationSettings: userSession.clientProxy.notificationSettings,
@@ -842,9 +838,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
} }
private func presentRoomMembersList() { private func presentRoomMembersList() {
let parameters = RoomMembersListScreenCoordinatorParameters(clientProxy: userSession.clientProxy, let parameters = RoomMembersListScreenCoordinatorParameters(userSession: userSession,
roomProxy: roomProxy, roomProxy: roomProxy,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
analytics: flowParameters.analytics) analytics: flowParameters.analytics)
let coordinator = RoomMembersListScreenCoordinator(parameters: parameters) let coordinator = RoomMembersListScreenCoordinator(parameters: parameters)
@@ -882,8 +877,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
let stackCoordinator = NavigationStackCoordinator() let stackCoordinator = NavigationStackCoordinator()
let roomDetailsEditParameters = RoomDetailsEditScreenCoordinatorParameters(roomProxy: roomProxy, let roomDetailsEditParameters = RoomDetailsEditScreenCoordinatorParameters(roomProxy: roomProxy,
clientProxy: userSession.clientProxy, userSession: userSession,
mediaProvider: userSession.mediaProvider,
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: flowParameters.appSettings), mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: flowParameters.appSettings),
navigationStackCoordinator: stackCoordinator, navigationStackCoordinator: stackCoordinator,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
@@ -1213,8 +1207,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
private func presentRoomMemberDetails(userID: String) { private func presentRoomMemberDetails(userID: String) {
let params = RoomMemberDetailsScreenCoordinatorParameters(userID: userID, let params = RoomMemberDetailsScreenCoordinatorParameters(userID: userID,
roomProxy: roomProxy, roomProxy: roomProxy,
clientProxy: userSession.clientProxy, userSession: userSession,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
analytics: flowParameters.analytics) analytics: flowParameters.analytics)
let coordinator = RoomMemberDetailsScreenCoordinator(parameters: params) let coordinator = RoomMemberDetailsScreenCoordinator(parameters: params)
@@ -1242,8 +1235,7 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
private func replaceRoomMemberDetailsWithUserProfile(userID: String) { private func replaceRoomMemberDetailsWithUserProfile(userID: String) {
let parameters = UserProfileScreenCoordinatorParameters(userID: userID, let parameters = UserProfileScreenCoordinatorParameters(userID: userID,
isPresentedModally: false, isPresentedModally: false,
clientProxy: userSession.clientProxy, userSession: userSession,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
analytics: flowParameters.analytics) analytics: flowParameters.analytics)
let coordinator = UserProfileScreenCoordinator(parameters: parameters) let coordinator = UserProfileScreenCoordinator(parameters: parameters)
@@ -1277,9 +1269,8 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
let stackCoordinator = NavigationStackCoordinator() let stackCoordinator = NavigationStackCoordinator()
let parameters = MessageForwardingScreenCoordinatorParameters(forwardingItem: forwardingItem, let parameters = MessageForwardingScreenCoordinatorParameters(forwardingItem: forwardingItem,
clientProxy: userSession.clientProxy, userSession: userSession,
roomSummaryProvider: roomSummaryProvider, roomSummaryProvider: roomSummaryProvider,
mediaProvider: userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController) userIndicatorController: flowParameters.userIndicatorController)
let coordinator = MessageForwardingScreenCoordinator(parameters: parameters) let coordinator = MessageForwardingScreenCoordinator(parameters: parameters)
@@ -1349,10 +1340,9 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
let selectedUsersSubject: CurrentValueSubject<[UserProfileProxy], Never> = .init([]) let selectedUsersSubject: CurrentValueSubject<[UserProfileProxy], Never> = .init([])
let stackCoordinator = NavigationStackCoordinator() let stackCoordinator = NavigationStackCoordinator()
let inviteParameters = InviteUsersScreenCoordinatorParameters(clientProxy: userSession.clientProxy, let inviteParameters = InviteUsersScreenCoordinatorParameters(userSession: userSession,
selectedUsers: .init(selectedUsersSubject), selectedUsers: .init(selectedUsersSubject),
roomType: .room(roomProxy: roomProxy), roomType: .room(roomProxy: roomProxy),
mediaProvider: userSession.mediaProvider,
userDiscoveryService: UserDiscoveryService(clientProxy: userSession.clientProxy), userDiscoveryService: UserDiscoveryService(clientProxy: userSession.clientProxy),
userIndicatorController: flowParameters.userIndicatorController) userIndicatorController: flowParameters.userIndicatorController)
@@ -133,8 +133,7 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
private func presentUserDetailsEditScreen() { private func presentUserDetailsEditScreen() {
let coordinator = UserDetailsEditScreenCoordinator(parameters: .init(orientationManager: flowParameters.windowManager, let coordinator = UserDetailsEditScreenCoordinator(parameters: .init(orientationManager: flowParameters.windowManager,
clientProxy: flowParameters.userSession.clientProxy, userSession: flowParameters.userSession,
mediaProvider: flowParameters.userSession.mediaProvider,
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: flowParameters.appSettings), mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: flowParameters.appSettings),
navigationStackCoordinator: navigationStackCoordinator, navigationStackCoordinator: navigationStackCoordinator,
userIndicatorController: flowParameters.userIndicatorController, userIndicatorController: flowParameters.userIndicatorController,
@@ -175,8 +174,7 @@ class SettingsFlowCoordinator: FlowCoordinatorProtocol {
private func presentBlockedUsersScreen() { private func presentBlockedUsersScreen() {
let coordinator = BlockedUsersScreenCoordinator(parameters: .init(hideProfiles: flowParameters.appSettings.hideIgnoredUserProfiles, let coordinator = BlockedUsersScreenCoordinator(parameters: .init(hideProfiles: flowParameters.appSettings.hideIgnoredUserProfiles,
clientProxy: flowParameters.userSession.clientProxy, userSession: flowParameters.userSession,
mediaProvider: flowParameters.userSession.mediaProvider,
userIndicatorController: flowParameters.userIndicatorController)) userIndicatorController: flowParameters.userIndicatorController))
navigationStackCoordinator.push(coordinator) navigationStackCoordinator.push(coordinator)
} }
+1 -1
View File
@@ -9,7 +9,7 @@ import Combine
import Foundation import Foundation
struct UserSessionMockConfiguration { struct UserSessionMockConfiguration {
let clientProxy: ClientProxyProtocol var clientProxy: ClientProxyProtocol = ClientProxyMock(.init())
} }
extension UserSessionMock { extension UserSessionMock {
@@ -11,7 +11,7 @@ extension UserSessionStoreMock {
convenience init(configuration: Configuration) { convenience init(configuration: Configuration) {
self.init() self.init()
userSessionForSessionDirectoriesPassphraseReturnValue = .success(UserSessionMock(.init(clientProxy: ClientProxyMock(.init())))) userSessionForSessionDirectoriesPassphraseReturnValue = .success(UserSessionMock(.init()))
clientSessionDelegate = KeychainControllerMock() clientSessionDelegate = KeychainControllerMock()
} }
} }
@@ -10,8 +10,7 @@ import SwiftUI
struct BlockedUsersScreenCoordinatorParameters { struct BlockedUsersScreenCoordinatorParameters {
let hideProfiles: Bool let hideProfiles: Bool
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
} }
@@ -20,8 +19,7 @@ final class BlockedUsersScreenCoordinator: CoordinatorProtocol {
init(parameters: BlockedUsersScreenCoordinatorParameters) { init(parameters: BlockedUsersScreenCoordinatorParameters) {
viewModel = BlockedUsersScreenViewModel(hideProfiles: parameters.hideProfiles, viewModel = BlockedUsersScreenViewModel(hideProfiles: parameters.hideProfiles,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
userIndicatorController: parameters.userIndicatorController) userIndicatorController: parameters.userIndicatorController)
} }
@@ -16,17 +16,16 @@ class BlockedUsersScreenViewModel: BlockedUsersScreenViewModelType, BlockedUsers
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
init(hideProfiles: Bool, init(hideProfiles: Bool,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
userIndicatorController: UserIndicatorControllerProtocol) { userIndicatorController: UserIndicatorControllerProtocol) {
self.hideProfiles = hideProfiles self.hideProfiles = hideProfiles
self.clientProxy = clientProxy clientProxy = userSession.clientProxy
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
let ignoredUsers = clientProxy.ignoredUsersPublisher.value?.map { UserProfileProxy(userID: $0) } let ignoredUsers = clientProxy.ignoredUsersPublisher.value?.map { UserProfileProxy(userID: $0) }
super.init(initialViewState: BlockedUsersScreenViewState(blockedUsers: ignoredUsers ?? []), super.init(initialViewState: BlockedUsersScreenViewState(blockedUsers: ignoredUsers ?? []),
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
showLoadingIndicator() showLoadingIndicator()
@@ -56,8 +56,7 @@ struct BlockedUsersScreen: View {
struct BlockedUsersScreen_Previews: PreviewProvider, TestablePreview { struct BlockedUsersScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = BlockedUsersScreenViewModel(hideProfiles: true, static let viewModel = BlockedUsersScreenViewModel(hideProfiles: true,
clientProxy: ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID)), userSession: UserSessionMock(.init(clientProxy: ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID)))),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: UserIndicatorControllerMock()) userIndicatorController: UserIndicatorControllerMock())
static var previews: some View { static var previews: some View {
@@ -9,10 +9,9 @@ import Combine
import SwiftUI import SwiftUI
struct InviteUsersScreenCoordinatorParameters { struct InviteUsersScreenCoordinatorParameters {
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let selectedUsers: CurrentValuePublisher<[UserProfileProxy], Never> let selectedUsers: CurrentValuePublisher<[UserProfileProxy], Never>
let roomType: InviteUsersScreenRoomType let roomType: InviteUsersScreenRoomType
let mediaProvider: MediaProviderProtocol
let userDiscoveryService: UserDiscoveryServiceProtocol let userDiscoveryService: UserDiscoveryServiceProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
} }
@@ -34,10 +33,9 @@ final class InviteUsersScreenCoordinator: CoordinatorProtocol {
} }
init(parameters: InviteUsersScreenCoordinatorParameters) { init(parameters: InviteUsersScreenCoordinatorParameters) {
viewModel = InviteUsersScreenViewModel(clientProxy: parameters.clientProxy, viewModel = InviteUsersScreenViewModel(userSession: parameters.userSession,
selectedUsers: parameters.selectedUsers, selectedUsers: parameters.selectedUsers,
roomType: parameters.roomType, roomType: parameters.roomType,
mediaProvider: parameters.mediaProvider,
userDiscoveryService: parameters.userDiscoveryService, userDiscoveryService: parameters.userDiscoveryService,
userIndicatorController: parameters.userIndicatorController) userIndicatorController: parameters.userIndicatorController)
} }
@@ -23,23 +23,24 @@ class InviteUsersScreenViewModel: InviteUsersScreenViewModelType, InviteUsersScr
actionsSubject.eraseToAnyPublisher() actionsSubject.eraseToAnyPublisher()
} }
init(clientProxy: ClientProxyProtocol, init(userSession: UserSessionProtocol,
selectedUsers: CurrentValuePublisher<[UserProfileProxy], Never>, selectedUsers: CurrentValuePublisher<[UserProfileProxy], Never>,
roomType: InviteUsersScreenRoomType, roomType: InviteUsersScreenRoomType,
mediaProvider: MediaProviderProtocol,
userDiscoveryService: UserDiscoveryServiceProtocol, userDiscoveryService: UserDiscoveryServiceProtocol,
userIndicatorController: UserIndicatorControllerProtocol) { userIndicatorController: UserIndicatorControllerProtocol) {
self.roomType = roomType self.roomType = roomType
self.userDiscoveryService = userDiscoveryService self.userDiscoveryService = userDiscoveryService
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
super.init(initialViewState: InviteUsersScreenViewState(selectedUsers: selectedUsers.value, isCreatingRoom: roomType.isCreatingRoom), mediaProvider: mediaProvider) super.init(initialViewState: InviteUsersScreenViewState(selectedUsers: selectedUsers.value,
isCreatingRoom: roomType.isCreatingRoom),
mediaProvider: userSession.mediaProvider)
setupSubscriptions(selectedUsers: selectedUsers) setupSubscriptions(selectedUsers: selectedUsers)
fetchMembersIfNeeded() fetchMembersIfNeeded()
Task { Task {
suggestedUsers = await clientProxy.recentConversationCounterparts() suggestedUsers = await userSession.clientProxy.recentConversationCounterparts()
if state.usersSection.type == .suggestions { if state.usersSection.type == .suggestions {
state.usersSection = .init(type: .suggestions, users: suggestedUsers) state.usersSection = .init(type: .suggestions, users: suggestedUsers)
@@ -153,10 +153,9 @@ struct InviteUsersScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = { static let viewModel = {
let userDiscoveryService = UserDiscoveryServiceMock() let userDiscoveryService = UserDiscoveryServiceMock()
userDiscoveryService.searchProfilesWithReturnValue = .success([.mockAlice]) userDiscoveryService.searchProfilesWithReturnValue = .success([.mockAlice])
return InviteUsersScreenViewModel(clientProxy: ClientProxyMock(.init()), return InviteUsersScreenViewModel(userSession: UserSessionMock(.init()),
selectedUsers: .init([]), selectedUsers: .init([]),
roomType: .draft, roomType: .draft,
mediaProvider: MediaProviderMock(configuration: .init()),
userDiscoveryService: userDiscoveryService, userDiscoveryService: userDiscoveryService,
userIndicatorController: UserIndicatorControllerMock()) userIndicatorController: UserIndicatorControllerMock())
}() }()
@@ -11,8 +11,7 @@ import SwiftUI
struct JoinRoomScreenCoordinatorParameters { struct JoinRoomScreenCoordinatorParameters {
let roomID: String let roomID: String
let via: [String] let via: [String]
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
let appSettings: AppSettings let appSettings: AppSettings
} }
@@ -37,8 +36,7 @@ final class JoinRoomScreenCoordinator: CoordinatorProtocol {
viewModel = JoinRoomScreenViewModel(roomID: parameters.roomID, viewModel = JoinRoomScreenViewModel(roomID: parameters.roomID,
via: parameters.via, via: parameters.via,
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
userIndicatorController: parameters.userIndicatorController) userIndicatorController: parameters.userIndicatorController)
} }
@@ -30,16 +30,15 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
init(roomID: String, init(roomID: String,
via: [String], via: [String],
appSettings: AppSettings, appSettings: AppSettings,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
userIndicatorController: UserIndicatorControllerProtocol) { userIndicatorController: UserIndicatorControllerProtocol) {
self.roomID = roomID self.roomID = roomID
self.via = via self.via = via
self.appSettings = appSettings self.appSettings = appSettings
self.clientProxy = clientProxy clientProxy = userSession.clientProxy
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
super.init(initialViewState: JoinRoomScreenViewState(roomID: roomID), mediaProvider: mediaProvider) super.init(initialViewState: JoinRoomScreenViewState(roomID: roomID), mediaProvider: userSession.mediaProvider)
clientProxy.hideInviteAvatarsPublisher clientProxy.hideInviteAvatarsPublisher
.removeDuplicates() .removeDuplicates()
@@ -416,8 +416,7 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview {
return JoinRoomScreenViewModel(roomID: "1", return JoinRoomScreenViewModel(roomID: "1",
via: [], via: [],
appSettings: appSettings, appSettings: appSettings,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController) userIndicatorController: ServiceLocator.shared.userIndicatorController)
} }
} }
@@ -12,7 +12,7 @@ struct MediaEventsTimelineScreenCoordinatorParameters {
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let mediaTimelineController: TimelineControllerProtocol let mediaTimelineController: TimelineControllerProtocol
let filesTimelineController: TimelineControllerProtocol let filesTimelineController: TimelineControllerProtocol
let mediaProvider: MediaProviderProtocol let userSession: UserSessionProtocol
let mediaPlayerProvider: MediaPlayerProviderProtocol let mediaPlayerProvider: MediaPlayerProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
let appMediator: AppMediatorProtocol let appMediator: AppMediatorProtocol
@@ -21,7 +21,6 @@ struct MediaEventsTimelineScreenCoordinatorParameters {
let emojiProvider: EmojiProviderProtocol let emojiProvider: EmojiProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
let timelineControllerFactory: TimelineControllerFactoryProtocol let timelineControllerFactory: TimelineControllerFactoryProtocol
let clientProxy: ClientProxyProtocol
} }
enum MediaEventsTimelineScreenCoordinatorAction { enum MediaEventsTimelineScreenCoordinatorAction {
@@ -44,7 +43,7 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
let mediaTimelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy, let mediaTimelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
timelineController: parameters.mediaTimelineController, timelineController: parameters.mediaTimelineController,
mediaProvider: parameters.mediaProvider, userSession: parameters.userSession,
mediaPlayerProvider: parameters.mediaPlayerProvider, mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager, voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
@@ -52,12 +51,11 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider, emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory, timelineControllerFactory: parameters.timelineControllerFactory)
clientProxy: parameters.clientProxy)
let filesTimelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy, let filesTimelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
timelineController: parameters.filesTimelineController, timelineController: parameters.filesTimelineController,
mediaProvider: parameters.mediaProvider, userSession: parameters.userSession,
mediaPlayerProvider: parameters.mediaPlayerProvider, mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager, voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
@@ -65,12 +63,11 @@ final class MediaEventsTimelineScreenCoordinator: CoordinatorProtocol {
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider, emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory, timelineControllerFactory: parameters.timelineControllerFactory)
clientProxy: parameters.clientProxy)
viewModel = MediaEventsTimelineScreenViewModel(mediaTimelineViewModel: mediaTimelineViewModel, viewModel = MediaEventsTimelineScreenViewModel(mediaTimelineViewModel: mediaTimelineViewModel,
filesTimelineViewModel: filesTimelineViewModel, filesTimelineViewModel: filesTimelineViewModel,
mediaProvider: parameters.mediaProvider, mediaProvider: parameters.userSession.mediaProvider,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
appMediator: parameters.appMediator) appMediator: parameters.appMediator)
@@ -274,7 +274,7 @@ struct MediaEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
return TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Preview room")), return TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Preview room")),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: UserIndicatorControllerMock(), userIndicatorController: UserIndicatorControllerMock(),
@@ -282,7 +282,6 @@ struct MediaEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
} }
} }
@@ -10,9 +10,8 @@ import SwiftUI
struct MessageForwardingScreenCoordinatorParameters { struct MessageForwardingScreenCoordinatorParameters {
let forwardingItem: MessageForwardingItem let forwardingItem: MessageForwardingItem
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let roomSummaryProvider: RoomSummaryProviderProtocol let roomSummaryProvider: RoomSummaryProviderProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
} }
@@ -32,10 +31,9 @@ final class MessageForwardingScreenCoordinator: CoordinatorProtocol {
init(parameters: MessageForwardingScreenCoordinatorParameters) { init(parameters: MessageForwardingScreenCoordinatorParameters) {
viewModel = MessageForwardingScreenViewModel(forwardingItem: parameters.forwardingItem, viewModel = MessageForwardingScreenViewModel(forwardingItem: parameters.forwardingItem,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
roomSummaryProvider: parameters.roomSummaryProvider, roomSummaryProvider: parameters.roomSummaryProvider,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController)
mediaProvider: parameters.mediaProvider)
} }
func start() { func start() {
@@ -23,16 +23,15 @@ class MessageForwardingScreenViewModel: MessageForwardingScreenViewModelType, Me
} }
init(forwardingItem: MessageForwardingItem, init(forwardingItem: MessageForwardingItem,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
roomSummaryProvider: RoomSummaryProviderProtocol, roomSummaryProvider: RoomSummaryProviderProtocol,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol) {
mediaProvider: MediaProviderProtocol) {
self.forwardingItem = forwardingItem self.forwardingItem = forwardingItem
self.clientProxy = clientProxy clientProxy = userSession.clientProxy
self.roomSummaryProvider = roomSummaryProvider self.roomSummaryProvider = roomSummaryProvider
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
super.init(initialViewState: MessageForwardingScreenViewState(), mediaProvider: mediaProvider) super.init(initialViewState: MessageForwardingScreenViewState(), mediaProvider: userSession.mediaProvider)
roomSummaryProvider.roomListPublisher roomSummaryProvider.roomListPublisher
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
@@ -97,10 +97,9 @@ struct MessageForwardingScreen_Previews: PreviewProvider, TestablePreview {
let viewModel = MessageForwardingScreenViewModel(forwardingItem: .init(id: .randomEvent, let viewModel = MessageForwardingScreenViewModel(forwardingItem: .init(id: .randomEvent,
roomID: "", roomID: "",
content: .init(noPointer: .init())), content: .init(noPointer: .init())),
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
roomSummaryProvider: summaryProvider, roomSummaryProvider: summaryProvider,
userIndicatorController: UserIndicatorControllerMock(), userIndicatorController: UserIndicatorControllerMock())
mediaProvider: MediaProviderMock(configuration: .init()))
NavigationStack { NavigationStack {
MessageForwardingScreen(context: viewModel.context) MessageForwardingScreen(context: viewModel.context)
@@ -11,7 +11,7 @@ import SwiftUI
struct PinnedEventsTimelineScreenCoordinatorParameters { struct PinnedEventsTimelineScreenCoordinatorParameters {
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let timelineController: TimelineControllerProtocol let timelineController: TimelineControllerProtocol
let mediaProvider: MediaProviderProtocol let userSession: UserSessionProtocol
let mediaPlayerProvider: MediaPlayerProviderProtocol let mediaPlayerProvider: MediaPlayerProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
let appMediator: AppMediatorProtocol let appMediator: AppMediatorProtocol
@@ -19,7 +19,6 @@ struct PinnedEventsTimelineScreenCoordinatorParameters {
let analytics: AnalyticsService let analytics: AnalyticsService
let emojiProvider: EmojiProviderProtocol let emojiProvider: EmojiProviderProtocol
let timelineControllerFactory: TimelineControllerFactoryProtocol let timelineControllerFactory: TimelineControllerFactoryProtocol
let clientProxy: ClientProxyProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
} }
@@ -49,7 +48,7 @@ final class PinnedEventsTimelineScreenCoordinator: CoordinatorProtocol {
viewModel = PinnedEventsTimelineScreenViewModel(analyticsService: parameters.analytics) viewModel = PinnedEventsTimelineScreenViewModel(analyticsService: parameters.analytics)
timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy, timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
timelineController: parameters.timelineController, timelineController: parameters.timelineController,
mediaProvider: parameters.mediaProvider, userSession: parameters.userSession,
mediaPlayerProvider: parameters.mediaPlayerProvider, mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager, voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
@@ -57,8 +56,7 @@ final class PinnedEventsTimelineScreenCoordinator: CoordinatorProtocol {
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider, emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory, timelineControllerFactory: parameters.timelineControllerFactory)
clientProxy: parameters.clientProxy)
} }
func start() { func start() {
@@ -71,7 +71,7 @@ struct PinnedEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
timelineController.timelineItems = [] timelineController.timelineItems = []
return TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Preview room")), return TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Preview room")),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: UserIndicatorControllerMock(), userIndicatorController: UserIndicatorControllerMock(),
@@ -79,8 +79,7 @@ struct PinnedEventsTimelineScreen_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
}() }()
static var previews: some View { static var previews: some View {
@@ -10,8 +10,7 @@ import SwiftUI
struct RoomDetailsEditScreenCoordinatorParameters { struct RoomDetailsEditScreenCoordinatorParameters {
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let mediaUploadingPreprocessor: MediaUploadingPreprocessor let mediaUploadingPreprocessor: MediaUploadingPreprocessor
weak var navigationStackCoordinator: NavigationStackCoordinator? weak var navigationStackCoordinator: NavigationStackCoordinator?
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
@@ -37,8 +36,7 @@ final class RoomDetailsEditScreenCoordinator: CoordinatorProtocol {
self.parameters = parameters self.parameters = parameters
viewModel = RoomDetailsEditScreenViewModel(roomProxy: parameters.roomProxy, viewModel = RoomDetailsEditScreenViewModel(roomProxy: parameters.roomProxy,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
mediaUploadingPreprocessor: parameters.mediaUploadingPreprocessor, mediaUploadingPreprocessor: parameters.mediaUploadingPreprocessor,
userIndicatorController: parameters.userIndicatorController) userIndicatorController: parameters.userIndicatorController)
} }
@@ -22,12 +22,11 @@ class RoomDetailsEditScreenViewModel: RoomDetailsEditScreenViewModelType, RoomDe
} }
init(roomProxy: JoinedRoomProxyProtocol, init(roomProxy: JoinedRoomProxyProtocol,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
mediaUploadingPreprocessor: MediaUploadingPreprocessor, mediaUploadingPreprocessor: MediaUploadingPreprocessor,
userIndicatorController: UserIndicatorControllerProtocol) { userIndicatorController: UserIndicatorControllerProtocol) {
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.clientProxy = clientProxy clientProxy = userSession.clientProxy
self.mediaUploadingPreprocessor = mediaUploadingPreprocessor self.mediaUploadingPreprocessor = mediaUploadingPreprocessor
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
@@ -40,7 +39,8 @@ class RoomDetailsEditScreenViewModel: RoomDetailsEditScreenViewModelType, RoomDe
initialName: roomName ?? "", initialName: roomName ?? "",
initialTopic: roomTopic ?? "", initialTopic: roomTopic ?? "",
avatarURL: roomAvatar, avatarURL: roomAvatar,
bindings: .init(name: roomName ?? "", topic: roomTopic ?? "")), mediaProvider: mediaProvider) bindings: .init(name: roomName ?? "", topic: roomTopic ?? "")),
mediaProvider: userSession.mediaProvider)
roomProxy.infoPublisher roomProxy.infoPublisher
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
@@ -155,8 +155,7 @@ struct RoomDetailsEditScreen_Previews: PreviewProvider, TestablePreview {
members: [.mockMeAdmin])) members: [.mockMeAdmin]))
return RoomDetailsEditScreenViewModel(roomProxy: roomProxy, return RoomDetailsEditScreenViewModel(roomProxy: roomProxy,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings), mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
userIndicatorController: UserIndicatorControllerMock.default) userIndicatorController: UserIndicatorControllerMock.default)
}() }()
@@ -167,8 +166,7 @@ struct RoomDetailsEditScreen_Previews: PreviewProvider, TestablePreview {
members: [.mockAlice])) members: [.mockAlice]))
return RoomDetailsEditScreenViewModel(roomProxy: roomProxy, return RoomDetailsEditScreenViewModel(roomProxy: roomProxy,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings), mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
userIndicatorController: UserIndicatorControllerMock.default) userIndicatorController: UserIndicatorControllerMock.default)
}() }()
@@ -10,8 +10,7 @@ import SwiftUI
struct RoomDetailsScreenCoordinatorParameters { struct RoomDetailsScreenCoordinatorParameters {
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let analyticsService: AnalyticsService let analyticsService: AnalyticsService
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
let notificationSettings: NotificationSettingsProxyProtocol let notificationSettings: NotificationSettingsProxyProtocol
@@ -50,8 +49,7 @@ final class RoomDetailsScreenCoordinator: CoordinatorProtocol {
init(parameters: RoomDetailsScreenCoordinatorParameters) { init(parameters: RoomDetailsScreenCoordinatorParameters) {
viewModel = RoomDetailsScreenViewModel(roomProxy: parameters.roomProxy, viewModel = RoomDetailsScreenViewModel(roomProxy: parameters.roomProxy,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
analyticsService: parameters.analyticsService, analyticsService: parameters.analyticsService,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
notificationSettingsProxy: parameters.notificationSettings, notificationSettingsProxy: parameters.notificationSettings,
@@ -12,9 +12,8 @@ typealias RoomDetailsScreenViewModelType = StateStoreViewModelV2<RoomDetailsScre
class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScreenViewModelProtocol { class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScreenViewModelProtocol {
private let roomProxy: JoinedRoomProxyProtocol private let roomProxy: JoinedRoomProxyProtocol
private let clientProxy: ClientProxyProtocol private let userSession: UserSessionProtocol
private let analyticsService: AnalyticsService private let analyticsService: AnalyticsService
private let mediaProvider: MediaProviderProtocol
private let userIndicatorController: UserIndicatorControllerProtocol private let userIndicatorController: UserIndicatorControllerProtocol
private let notificationSettingsProxy: NotificationSettingsProxyProtocol private let notificationSettingsProxy: NotificationSettingsProxyProtocol
private let attributedStringBuilder: AttributedStringBuilderProtocol private let attributedStringBuilder: AttributedStringBuilderProtocol
@@ -45,8 +44,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
} }
init(roomProxy: JoinedRoomProxyProtocol, init(roomProxy: JoinedRoomProxyProtocol,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
analyticsService: AnalyticsService, analyticsService: AnalyticsService,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol,
notificationSettingsProxy: NotificationSettingsProxyProtocol, notificationSettingsProxy: NotificationSettingsProxyProtocol,
@@ -54,8 +52,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
appMediator: AppMediatorProtocol, appMediator: AppMediatorProtocol,
appSettings: AppSettings) { appSettings: AppSettings) {
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.clientProxy = clientProxy self.userSession = userSession
self.mediaProvider = mediaProvider
self.analyticsService = analyticsService self.analyticsService = analyticsService
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
self.notificationSettingsProxy = notificationSettingsProxy self.notificationSettingsProxy = notificationSettingsProxy
@@ -72,14 +69,14 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
joinedMembersCount: roomProxy.infoPublisher.value.joinedMembersCount, joinedMembersCount: roomProxy.infoPublisher.value.joinedMembersCount,
notificationSettingsState: .loading, notificationSettingsState: .loading,
bindings: .init()), bindings: .init()),
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
appSettings.$knockingEnabled appSettings.$knockingEnabled
.weakAssign(to: \.state.knockingEnabled, on: self) .weakAssign(to: \.state.knockingEnabled, on: self)
.store(in: &cancellables) .store(in: &cancellables)
Task { Task {
state.reportRoomEnabled = await clientProxy.isReportRoomSupported state.reportRoomEnabled = await userSession.clientProxy.isReportRoomSupported
} }
appMediator.networkMonitor.reachabilityPublisher appMediator.networkMonitor.reachabilityPublisher
@@ -297,14 +294,14 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
if roomProxy.isDirectOneToOneRoom { if roomProxy.isDirectOneToOneRoom {
if var dmRecipientInfo = state.dmRecipientInfo { if var dmRecipientInfo = state.dmRecipientInfo {
if case let .success(userIdentity) = await clientProxy.userIdentity(for: dmRecipientInfo.member.id) { if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: dmRecipientInfo.member.id) {
dmRecipientInfo.verificationState = userIdentity?.verificationState dmRecipientInfo.verificationState = userIdentity?.verificationState
state.dmRecipientInfo = dmRecipientInfo state.dmRecipientInfo = dmRecipientInfo
} }
} }
} else { } else {
for member in roomProxy.membersPublisher.value { for member in roomProxy.membersPublisher.value {
if case let .success(userIdentity) = await clientProxy.userIdentity(for: member.userID) { if case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID) {
if userIdentity?.verificationState == .verificationViolation { if userIdentity?.verificationState == .verificationViolation {
state.hasMemberIdentityVerificationStateViolations = true state.hasMemberIdentityVerificationStateViolations = true
return return
@@ -407,7 +404,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
} }
state.isProcessingIgnoreRequest = true state.isProcessingIgnoreRequest = true
let result = await clientProxy.ignoreUser(dmUserID) let result = await userSession.clientProxy.ignoreUser(dmUserID)
state.isProcessingIgnoreRequest = false state.isProcessingIgnoreRequest = false
switch result { switch result {
case .success: case .success:
@@ -428,7 +425,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
} }
state.isProcessingIgnoreRequest = true state.isProcessingIgnoreRequest = true
let result = await clientProxy.unignoreUser(dmUserID) let result = await userSession.clientProxy.unignoreUser(dmUserID)
state.isProcessingIgnoreRequest = false state.isProcessingIgnoreRequest = false
switch result { switch result {
case .success: case .success:
@@ -452,7 +449,7 @@ class RoomDetailsScreenViewModel: RoomDetailsScreenViewModelType, RoomDetailsScr
// We don't actually know the mime type here, assume it's an image. // We don't actually know the mime type here, assume it's an image.
if let mediaSource = try? MediaSourceProxy(url: url, mimeType: "image/jpeg"), if let mediaSource = try? MediaSourceProxy(url: url, mimeType: "image/jpeg"),
case let .success(file) = await mediaProvider.loadFileFromSource(mediaSource) { case let .success(file) = await userSession.mediaProvider.loadFileFromSource(mediaSource) {
state.bindings.mediaPreviewItem = MediaPreviewItem(file: file, title: roomProxy.infoPublisher.value.displayName) state.bindings.mediaPreviewItem = MediaPreviewItem(file: file, title: roomProxy.infoPublisher.value.displayName)
} }
} }
@@ -392,8 +392,7 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview {
let notificationSettingsProxy = NotificationSettingsProxyMock(with: notificationSettingsProxyMockConfiguration) let notificationSettingsProxy = NotificationSettingsProxyMock(with: notificationSettingsProxyMockConfiguration)
return .init(roomProxy: roomProxy, return .init(roomProxy: roomProxy,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxy, notificationSettingsProxy: notificationSettingsProxy,
@@ -423,8 +422,7 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview {
let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init()) let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init())
return .init(roomProxy: roomProxy, return .init(roomProxy: roomProxy,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxy, notificationSettingsProxy: notificationSettingsProxy,
@@ -463,8 +461,7 @@ struct RoomDetailsScreen_Previews: PreviewProvider, TestablePreview {
let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init()) let notificationSettingsProxy = NotificationSettingsProxyMock(with: .init())
return .init(roomProxy: roomProxy, return .init(roomProxy: roomProxy,
clientProxy: clientProxyMock, userSession: UserSessionMock(.init(clientProxy: clientProxyMock)),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxy, notificationSettingsProxy: notificationSettingsProxy,
@@ -9,8 +9,7 @@ import Combine
import SwiftUI import SwiftUI
struct RoomDirectorySearchScreenCoordinatorParameters { struct RoomDirectorySearchScreenCoordinatorParameters {
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
} }
@@ -31,9 +30,8 @@ final class RoomDirectorySearchScreenCoordinator: CoordinatorProtocol {
} }
init(parameters: RoomDirectorySearchScreenCoordinatorParameters) { init(parameters: RoomDirectorySearchScreenCoordinatorParameters) {
viewModel = RoomDirectorySearchScreenViewModel(clientProxy: parameters.clientProxy, viewModel = RoomDirectorySearchScreenViewModel(userSession: parameters.userSession,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController)
mediaProvider: parameters.mediaProvider)
} }
func start() { func start() {
@@ -19,13 +19,12 @@ class RoomDirectorySearchScreenViewModel: RoomDirectorySearchScreenViewModelType
actionsSubject.eraseToAnyPublisher() actionsSubject.eraseToAnyPublisher()
} }
init(clientProxy: ClientProxyProtocol, init(userSession: UserSessionProtocol,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol) {
mediaProvider: MediaProviderProtocol) { roomDirectorySearchProxy = userSession.clientProxy.roomDirectorySearchProxy()
roomDirectorySearchProxy = clientProxy.roomDirectorySearchProxy()
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
super.init(initialViewState: RoomDirectorySearchScreenViewState(), mediaProvider: mediaProvider) super.init(initialViewState: RoomDirectorySearchScreenViewState(), mediaProvider: userSession.mediaProvider)
state.rooms = roomDirectorySearchProxy.resultsPublisher.value state.rooms = roomDirectorySearchProxy.resultsPublisher.value
@@ -91,9 +91,8 @@ struct RoomDirectorySearchScreen_Previews: PreviewProvider, TestablePreview {
let clientProxy = ClientProxyMock(.init(roomDirectorySearchProxy: roomDirectorySearchProxy)) let clientProxy = ClientProxyMock(.init(roomDirectorySearchProxy: roomDirectorySearchProxy))
return RoomDirectorySearchScreenViewModel(clientProxy: clientProxy, return RoomDirectorySearchScreenViewModel(userSession: UserSessionMock(.init(clientProxy: clientProxy)),
userIndicatorController: UserIndicatorControllerMock(), userIndicatorController: UserIndicatorControllerMock())
mediaProvider: MediaProviderMock(configuration: .init()))
}() }()
static var previews: some View { static var previews: some View {
@@ -11,8 +11,7 @@ import SwiftUI
struct RoomMemberDetailsScreenCoordinatorParameters { struct RoomMemberDetailsScreenCoordinatorParameters {
let userID: String let userID: String
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
let analytics: AnalyticsService let analytics: AnalyticsService
} }
@@ -37,8 +36,7 @@ final class RoomMemberDetailsScreenCoordinator: CoordinatorProtocol {
init(parameters: RoomMemberDetailsScreenCoordinatorParameters) { init(parameters: RoomMemberDetailsScreenCoordinatorParameters) {
viewModel = RoomMemberDetailsScreenViewModel(userID: parameters.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: parameters.userID,
roomProxy: parameters.roomProxy, roomProxy: parameters.roomProxy,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
analytics: parameters.analytics) analytics: parameters.analytics)
} }
@@ -12,8 +12,7 @@ typealias RoomMemberDetailsScreenViewModelType = StateStoreViewModel<RoomMemberD
class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, RoomMemberDetailsScreenViewModelProtocol { class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, RoomMemberDetailsScreenViewModelProtocol {
private let roomProxy: JoinedRoomProxyProtocol private let roomProxy: JoinedRoomProxyProtocol
private let clientProxy: ClientProxyProtocol private let userSession: UserSessionProtocol
private let mediaProvider: MediaProviderProtocol
private let userIndicatorController: UserIndicatorControllerProtocol private let userIndicatorController: UserIndicatorControllerProtocol
private let analytics: AnalyticsService private let analytics: AnalyticsService
@@ -27,19 +26,17 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
init(userID: String, init(userID: String,
roomProxy: JoinedRoomProxyProtocol, roomProxy: JoinedRoomProxyProtocol,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol,
analytics: AnalyticsService) { analytics: AnalyticsService) {
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.clientProxy = clientProxy self.userSession = userSession
self.mediaProvider = mediaProvider
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
self.analytics = analytics self.analytics = analytics
let initialViewState = RoomMemberDetailsScreenViewState(userID: userID, bindings: .init()) let initialViewState = RoomMemberDetailsScreenViewState(userID: userID, bindings: .init())
super.init(initialViewState: initialViewState, mediaProvider: mediaProvider) super.init(initialViewState: initialViewState, mediaProvider: userSession.mediaProvider)
showMemberLoadingIndicator() showMemberLoadingIndicator()
@@ -88,7 +85,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
case .verifyUser: case .verifyUser:
actionsSubject.send(.verifyUser(userID: state.userID)) actionsSubject.send(.verifyUser(userID: state.userID))
case .withdrawVerification: case .withdrawVerification:
Task { await clientProxy.withdrawUserIdentityVerification(state.userID) } Task { await userSession.clientProxy.withdrawUserIdentityVerification(state.userID) }
} }
} }
@@ -100,7 +97,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
roomMemberProxy = member roomMemberProxy = member
state.memberDetails = RoomMemberDetails(withProxy: member) state.memberDetails = RoomMemberDetails(withProxy: member)
state.isOwnMemberDetails = member.userID == roomProxy.ownUserID state.isOwnMemberDetails = member.userID == roomProxy.ownUserID
switch clientProxy.directRoomForUserID(member.userID) { switch userSession.clientProxy.directRoomForUserID(member.userID) {
case .success(let roomID): case .success(let roomID):
state.dmRoomID = roomID state.dmRoomID = roomID
case .failure: case .failure:
@@ -114,7 +111,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
actionsSubject.send(.openUserProfile) actionsSubject.send(.openUserProfile)
} }
if case let .success(.some(identity)) = await clientProxy.userIdentity(for: state.userID) { if case let .success(.some(identity)) = await userSession.clientProxy.userIdentity(for: state.userID) {
state.verificationState = identity.verificationState state.verificationState = identity.verificationState
} else { } else {
MXLog.error("Failed to find the member's identity.") MXLog.error("Failed to find the member's identity.")
@@ -127,7 +124,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
} }
state.isProcessingIgnoreRequest = true state.isProcessingIgnoreRequest = true
let result = await clientProxy.ignoreUser(roomMemberProxy.userID) let result = await userSession.clientProxy.ignoreUser(roomMemberProxy.userID)
state.isProcessingIgnoreRequest = false state.isProcessingIgnoreRequest = false
switch result { switch result {
case .success: case .success:
@@ -148,7 +145,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
} }
state.isProcessingIgnoreRequest = true state.isProcessingIgnoreRequest = true
let result = await clientProxy.unignoreUser(roomMemberProxy.userID) let result = await userSession.clientProxy.unignoreUser(roomMemberProxy.userID)
state.isProcessingIgnoreRequest = false state.isProcessingIgnoreRequest = false
switch result { switch result {
case .success: case .success:
@@ -179,7 +176,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
// We don't actually know the mime type here, assume it's an image. // We don't actually know the mime type here, assume it's an image.
if let mediaSource = try? MediaSourceProxy(url: url, mimeType: "image/jpeg"), if let mediaSource = try? MediaSourceProxy(url: url, mimeType: "image/jpeg"),
case let .success(file) = await mediaProvider.loadFileFromSource(mediaSource) { case let .success(file) = await userSession.mediaProvider.loadFileFromSource(mediaSource) {
state.bindings.mediaPreviewItem = MediaPreviewItem(file: file, title: roomMemberProxy.displayName) state.bindings.mediaPreviewItem = MediaPreviewItem(file: file, title: roomMemberProxy.displayName)
} }
} }
@@ -195,7 +192,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
delay: .milliseconds(200)) delay: .milliseconds(200))
defer { userIndicatorController.retractIndicatorWithId(loadingIndicatorIdentifier) } defer { userIndicatorController.retractIndicatorWithId(loadingIndicatorIdentifier) }
switch clientProxy.directRoomForUserID(roomMemberProxy.userID) { switch userSession.clientProxy.directRoomForUserID(roomMemberProxy.userID) {
case .success(let roomID): case .success(let roomID):
if let roomID { if let roomID {
actionsSubject.send(.openDirectChat(roomID: roomID)) actionsSubject.send(.openDirectChat(roomID: roomID))
@@ -218,7 +215,7 @@ class RoomMemberDetailsScreenViewModel: RoomMemberDetailsScreenViewModelType, Ro
delay: .milliseconds(200)) delay: .milliseconds(200))
defer { userIndicatorController.retractIndicatorWithId(loadingIndicatorIdentifier) } defer { userIndicatorController.retractIndicatorWithId(loadingIndicatorIdentifier) }
switch await clientProxy.createDirectRoom(with: roomMemberProxy.userID, expectedRoomName: roomMemberProxy.displayName) { switch await userSession.clientProxy.createDirectRoom(with: roomMemberProxy.userID, expectedRoomName: roomMemberProxy.displayName) {
case .success(let roomID): case .success(let roomID):
analytics.trackCreatedRoom(isDM: true) analytics.trackCreatedRoom(isDM: true)
actionsSubject.send(.openDirectChat(roomID: roomID)) actionsSubject.send(.openDirectChat(roomID: roomID))
@@ -228,8 +228,7 @@ struct RoomMemberDetailsScreen_Previews: PreviewProvider, TestablePreview {
return RoomMemberDetailsScreenViewModel(userID: member.userID, return RoomMemberDetailsScreenViewModel(userID: member.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: clientProxyMock, userSession: UserSessionMock(.init(clientProxy: clientProxyMock)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
} }
@@ -9,9 +9,8 @@ import Combine
import SwiftUI import SwiftUI
struct RoomMembersListScreenCoordinatorParameters { struct RoomMembersListScreenCoordinatorParameters {
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
let analytics: AnalyticsService let analytics: AnalyticsService
} }
@@ -32,9 +31,8 @@ final class RoomMembersListScreenCoordinator: CoordinatorProtocol {
} }
init(parameters: RoomMembersListScreenCoordinatorParameters) { init(parameters: RoomMembersListScreenCoordinatorParameters) {
viewModel = RoomMembersListScreenViewModel(clientProxy: parameters.clientProxy, viewModel = RoomMembersListScreenViewModel(userSession: parameters.userSession,
roomProxy: parameters.roomProxy, roomProxy: parameters.roomProxy,
mediaProvider: parameters.mediaProvider,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
analytics: parameters.analytics) analytics: parameters.analytics)
} }
@@ -11,11 +11,10 @@ import SwiftUI
typealias RoomMembersListScreenViewModelType = StateStoreViewModel<RoomMembersListScreenViewState, RoomMembersListScreenViewAction> typealias RoomMembersListScreenViewModelType = StateStoreViewModel<RoomMembersListScreenViewState, RoomMembersListScreenViewAction>
class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMembersListScreenViewModelProtocol { class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMembersListScreenViewModelProtocol {
private let clientProxy: ClientProxyProtocol private let userSession: UserSessionProtocol
private let roomProxy: JoinedRoomProxyProtocol private let roomProxy: JoinedRoomProxyProtocol
private let userIndicatorController: UserIndicatorControllerProtocol private let userIndicatorController: UserIndicatorControllerProtocol
private let analytics: AnalyticsService private let analytics: AnalyticsService
private let mediaProvider: MediaProviderProtocol
private var members: [RoomMemberProxyProtocol] = [] private var members: [RoomMemberProxyProtocol] = []
private var currentUserProxy: RoomMemberProxyProtocol? private var currentUserProxy: RoomMemberProxyProtocol?
@@ -27,20 +26,18 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
} }
init(initialMode: RoomMembersListScreenMode = .members, init(initialMode: RoomMembersListScreenMode = .members,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
roomProxy: JoinedRoomProxyProtocol, roomProxy: JoinedRoomProxyProtocol,
mediaProvider: MediaProviderProtocol,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol,
analytics: AnalyticsService) { analytics: AnalyticsService) {
self.clientProxy = clientProxy self.userSession = userSession
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
self.analytics = analytics self.analytics = analytics
self.mediaProvider = mediaProvider
super.init(initialViewState: .init(joinedMembersCount: roomProxy.infoPublisher.value.joinedMembersCount, super.init(initialViewState: .init(joinedMembersCount: roomProxy.infoPublisher.value.joinedMembersCount,
bindings: .init(mode: initialMode)), bindings: .init(mode: initialMode)),
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
setupMembers() setupMembers()
} }
@@ -112,7 +109,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
} }
private func buildMembersDetails(members: [RoomMemberProxyProtocol]) async -> RoomMembersDetails { private func buildMembersDetails(members: [RoomMemberProxyProtocol]) async -> RoomMembersDetails {
await Task.detached { [clientProxy, roomProxy] in await Task.detached { [userSession, roomProxy] in
// accessing RoomMember's properties is very slow. We need to do it in a background thread. // accessing RoomMember's properties is very slow. We need to do it in a background thread.
var invitedMembers: [RoomMemberListScreenEntry] = .init() var invitedMembers: [RoomMemberListScreenEntry] = .init()
var joinedMembers: [RoomMemberListScreenEntry] = .init() var joinedMembers: [RoomMemberListScreenEntry] = .init()
@@ -121,7 +118,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
for member in members { for member in members {
var verificationState: UserIdentityVerificationState = .notVerified var verificationState: UserIdentityVerificationState = .notVerified
if roomProxy.infoPublisher.value.isEncrypted, // We don't care about identity statuses on non-encrypted rooms if roomProxy.infoPublisher.value.isEncrypted, // We don't care about identity statuses on non-encrypted rooms
case let .success(userIdentity) = await clientProxy.userIdentity(for: member.userID), case let .success(userIdentity) = await userSession.clientProxy.userIdentity(for: member.userID),
let userIdentity { let userIdentity {
verificationState = userIdentity.verificationState verificationState = userIdentity.verificationState
} }
@@ -151,15 +148,15 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
return return
} }
let manageMemeberViewModel = ManageRoomMemberSheetViewModel(memberDetails: .memberDetails(roomMember: member), let manageMemberViewModel = ManageRoomMemberSheetViewModel(memberDetails: .memberDetails(roomMember: member),
permissions: .init(canKick: state.canKickUsers, permissions: .init(canKick: state.canKickUsers,
canBan: state.canBanUsers, canBan: state.canBanUsers,
ownPowerLevel: currentUserProxy?.powerLevel ?? .init(value: 0)), ownPowerLevel: currentUserProxy?.powerLevel ?? .init(value: 0)),
roomProxy: roomProxy, roomProxy: roomProxy,
userIndicatorController: userIndicatorController, userIndicatorController: userIndicatorController,
analyticsService: analytics, analyticsService: analytics,
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
manageMemeberViewModel.actions.sink { [weak self] action in manageMemberViewModel.actions.sink { [weak self] action in
guard let self else { return } guard let self else { return }
switch action { switch action {
case .dismiss(let shouldShowDetails): case .dismiss(let shouldShowDetails):
@@ -170,7 +167,7 @@ class RoomMembersListScreenViewModel: RoomMembersListScreenViewModelType, RoomMe
} }
} }
.store(in: &cancellables) .store(in: &cancellables)
state.bindings.manageMemeberViewModel = manageMemeberViewModel state.bindings.manageMemeberViewModel = manageMemberViewModel
} }
private func showMemberDetails(_ member: RoomMemberDetails) { private func showMemberDetails(_ member: RoomMemberDetails) {
@@ -196,12 +196,11 @@ struct RoomMembersListScreen_Previews: PreviewProvider, TestablePreview {
} }
return RoomMembersListScreenViewModel(initialMode: initialMode, return RoomMembersListScreenViewModel(initialMode: initialMode,
clientProxy: clientProxyMock, userSession: UserSessionMock(.init(clientProxy: clientProxyMock)),
roomProxy: JoinedRoomProxyMock(.init(name: "Some room", roomProxy: JoinedRoomProxyMock(.init(name: "Some room",
members: members, members: members,
ownUserID: ownUserID, ownUserID: ownUserID,
powerLevelsConfiguration: .init(canUserInvite: false))), powerLevelsConfiguration: .init(canUserInvite: false))),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
} }
@@ -118,9 +118,8 @@ struct RoomMembersListMemberCell_Previews: PreviewProvider, TestablePreview {
verificationState: .verificationViolation) verificationState: .verificationViolation)
] ]
static let viewModel = RoomMembersListScreenViewModel(clientProxy: ClientProxyMock(.init()), static let viewModel = RoomMembersListScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Some room", members: [])), roomProxy: JoinedRoomProxyMock(.init(name: "Some room", members: [])),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
static var previews: some View { static var previews: some View {
@@ -12,12 +12,11 @@ import SwiftUI
import WysiwygComposer import WysiwygComposer
struct RoomScreenCoordinatorParameters { struct RoomScreenCoordinatorParameters {
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
var focussedEvent: FocusEvent? var focussedEvent: FocusEvent?
var sharedText: String? var sharedText: String?
let timelineController: TimelineControllerProtocol let timelineController: TimelineControllerProtocol
let mediaProvider: MediaProviderProtocol
let mediaPlayerProvider: MediaPlayerProviderProtocol let mediaPlayerProvider: MediaPlayerProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
let emojiProvider: EmojiProviderProtocol let emojiProvider: EmojiProviderProtocol
@@ -69,10 +68,9 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
selectedPinnedEventID = focussedEvent.shouldSetPin ? focussedEvent.eventID : nil selectedPinnedEventID = focussedEvent.shouldSetPin ? focussedEvent.eventID : nil
} }
roomViewModel = RoomScreenViewModel(clientProxy: parameters.clientProxy, roomViewModel = RoomScreenViewModel(userSession: parameters.userSession,
roomProxy: parameters.roomProxy, roomProxy: parameters.roomProxy,
initialSelectedPinnedEventID: selectedPinnedEventID, initialSelectedPinnedEventID: selectedPinnedEventID,
mediaProvider: parameters.mediaProvider,
ongoingCallRoomIDPublisher: parameters.ongoingCallRoomIDPublisher, ongoingCallRoomIDPublisher: parameters.ongoingCallRoomIDPublisher,
appMediator: parameters.appMediator, appMediator: parameters.appMediator,
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
@@ -83,7 +81,7 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy, timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
focussedEventID: parameters.focussedEvent?.eventID, focussedEventID: parameters.focussedEvent?.eventID,
timelineController: parameters.timelineController, timelineController: parameters.timelineController,
mediaProvider: parameters.mediaProvider, userSession: parameters.userSession,
mediaPlayerProvider: parameters.mediaPlayerProvider, mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager, voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
@@ -91,8 +89,7 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider, emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory, timelineControllerFactory: parameters.timelineControllerFactory)
clientProxy: parameters.clientProxy)
let wysiwygViewModel = WysiwygComposerViewModel(minHeight: ComposerConstant.minHeight, let wysiwygViewModel = WysiwygComposerViewModel(minHeight: ComposerConstant.minHeight,
maxCompressedHeight: ComposerConstant.maxHeight, maxCompressedHeight: ComposerConstant.maxHeight,
@@ -102,7 +99,7 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
roomProxy: parameters.roomProxy, roomProxy: parameters.roomProxy,
wysiwygViewModel: wysiwygViewModel, wysiwygViewModel: wysiwygViewModel,
completionSuggestionService: parameters.completionSuggestionService, completionSuggestionService: parameters.completionSuggestionService,
mediaProvider: parameters.mediaProvider, mediaProvider: parameters.userSession.mediaProvider,
mentionDisplayHelper: ComposerMentionDisplayHelper(timelineContext: timelineViewModel.context), mentionDisplayHelper: ComposerMentionDisplayHelper(timelineContext: timelineViewModel.context),
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
@@ -50,17 +50,16 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
} }
} }
init(clientProxy: ClientProxyProtocol, init(userSession: UserSessionProtocol,
roomProxy: JoinedRoomProxyProtocol, roomProxy: JoinedRoomProxyProtocol,
initialSelectedPinnedEventID: String?, initialSelectedPinnedEventID: String?,
mediaProvider: MediaProviderProtocol,
ongoingCallRoomIDPublisher: CurrentValuePublisher<String?, Never>, ongoingCallRoomIDPublisher: CurrentValuePublisher<String?, Never>,
appMediator: AppMediatorProtocol, appMediator: AppMediatorProtocol,
appSettings: AppSettings, appSettings: AppSettings,
appHooks: AppHooks, appHooks: AppHooks,
analyticsService: AnalyticsService, analyticsService: AnalyticsService,
userIndicatorController: UserIndicatorControllerProtocol) { userIndicatorController: UserIndicatorControllerProtocol) {
self.clientProxy = clientProxy clientProxy = userSession.clientProxy
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.appMediator = appMediator self.appMediator = appMediator
self.appSettings = appSettings self.appSettings = appSettings
@@ -75,7 +74,7 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
hasOngoingCall: roomProxy.infoPublisher.value.hasRoomCall, hasOngoingCall: roomProxy.infoPublisher.value.hasRoomCall,
hasSuccessor: roomProxy.infoPublisher.value.successor != nil) hasSuccessor: roomProxy.infoPublisher.value.successor != nil)
super.init(initialViewState: appHooks.roomScreenHook.update(viewState), super.init(initialViewState: appHooks.roomScreenHook.update(viewState),
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
updateRoomInfo(roomProxy.infoPublisher.value) updateRoomInfo(roomProxy.infoPublisher.value)
setupSubscriptions(ongoingCallRoomIDPublisher: ongoingCallRoomIDPublisher) setupSubscriptions(ongoingCallRoomIDPublisher: ongoingCallRoomIDPublisher)
@@ -416,10 +415,9 @@ extension RoomScreenViewModel {
static func mock(roomProxyMock: JoinedRoomProxyMock, static func mock(roomProxyMock: JoinedRoomProxyMock,
clientProxyMock: ClientProxyMock = ClientProxyMock(), clientProxyMock: ClientProxyMock = ClientProxyMock(),
appHooks: AppHooks = AppHooks()) -> RoomScreenViewModel { appHooks: AppHooks = AppHooks()) -> RoomScreenViewModel {
RoomScreenViewModel(clientProxy: clientProxyMock, RoomScreenViewModel(userSession: UserSessionMock(.init(clientProxy: clientProxyMock)),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -257,7 +257,7 @@ struct RoomScreen_Previews: PreviewProvider, TestablePreview {
let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock) let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock)
let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -265,8 +265,7 @@ struct RoomScreen_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
return .init(room: roomViewModel, timeline: timelineViewModel) return .init(room: roomViewModel, timeline: timelineViewModel)
} }
@@ -9,9 +9,8 @@ import Combine
import SwiftUI import SwiftUI
struct RoomSelectionScreenCoordinatorParameters { struct RoomSelectionScreenCoordinatorParameters {
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let roomSummaryProvider: RoomSummaryProviderProtocol let roomSummaryProvider: RoomSummaryProviderProtocol
let mediaProvider: MediaProviderProtocol
} }
enum RoomSelectionScreenCoordinatorAction { enum RoomSelectionScreenCoordinatorAction {
@@ -29,9 +28,8 @@ final class RoomSelectionScreenCoordinator: CoordinatorProtocol {
} }
init(parameters: RoomSelectionScreenCoordinatorParameters) { init(parameters: RoomSelectionScreenCoordinatorParameters) {
viewModel = RoomSelectionScreenViewModel(clientProxy: parameters.clientProxy, viewModel = RoomSelectionScreenViewModel(userSession: parameters.userSession,
roomSummaryProvider: parameters.roomSummaryProvider, roomSummaryProvider: parameters.roomSummaryProvider)
mediaProvider: parameters.mediaProvider)
} }
func start() { func start() {
@@ -20,13 +20,12 @@ class RoomSelectionScreenViewModel: RoomSelectionScreenViewModelType, RoomSelect
actionsSubject.eraseToAnyPublisher() actionsSubject.eraseToAnyPublisher()
} }
init(clientProxy: ClientProxyProtocol, init(userSession: UserSessionProtocol,
roomSummaryProvider: RoomSummaryProviderProtocol, roomSummaryProvider: RoomSummaryProviderProtocol) {
mediaProvider: MediaProviderProtocol) { clientProxy = userSession.clientProxy
self.clientProxy = clientProxy
self.roomSummaryProvider = roomSummaryProvider self.roomSummaryProvider = roomSummaryProvider
super.init(initialViewState: RoomSelectionScreenViewState(), mediaProvider: mediaProvider) super.init(initialViewState: RoomSelectionScreenViewState(), mediaProvider: userSession.mediaProvider)
roomSummaryProvider.roomListPublisher roomSummaryProvider.roomListPublisher
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
@@ -94,9 +94,8 @@ private struct RoomSelectionListRow: View {
struct RoomSelectionScreen_Previews: PreviewProvider, TestablePreview { struct RoomSelectionScreen_Previews: PreviewProvider, TestablePreview {
static var previews: some View { static var previews: some View {
let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))) let summaryProvider = RoomSummaryProviderMock(.init(state: .loaded(.mockRooms)))
let viewModel = RoomSelectionScreenViewModel(clientProxy: ClientProxyMock(.init()), let viewModel = RoomSelectionScreenViewModel(userSession: UserSessionMock(.init()),
roomSummaryProvider: summaryProvider, roomSummaryProvider: summaryProvider)
mediaProvider: MediaProviderMock(configuration: .init()))
NavigationStack { NavigationStack {
RoomSelectionScreen(context: viewModel.context) RoomSelectionScreen(context: viewModel.context)
@@ -10,8 +10,7 @@ import SwiftUI
struct UserDetailsEditScreenCoordinatorParameters { struct UserDetailsEditScreenCoordinatorParameters {
let orientationManager: OrientationManagerProtocol let orientationManager: OrientationManagerProtocol
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let mediaUploadingPreprocessor: MediaUploadingPreprocessor let mediaUploadingPreprocessor: MediaUploadingPreprocessor
weak var navigationStackCoordinator: NavigationStackCoordinator? weak var navigationStackCoordinator: NavigationStackCoordinator?
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
@@ -26,8 +25,7 @@ final class UserDetailsEditScreenCoordinator: CoordinatorProtocol {
init(parameters: UserDetailsEditScreenCoordinatorParameters) { init(parameters: UserDetailsEditScreenCoordinatorParameters) {
self.parameters = parameters self.parameters = parameters
viewModel = UserDetailsEditScreenViewModel(clientProxy: parameters.clientProxy, viewModel = UserDetailsEditScreenViewModel(userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
mediaUploadingPreprocessor: parameters.mediaUploadingPreprocessor, mediaUploadingPreprocessor: parameters.mediaUploadingPreprocessor,
userIndicatorController: parameters.userIndicatorController) userIndicatorController: parameters.userIndicatorController)
} }
@@ -20,16 +20,15 @@ class UserDetailsEditScreenViewModel: UserDetailsEditScreenViewModelType, UserDe
actionsSubject.eraseToAnyPublisher() actionsSubject.eraseToAnyPublisher()
} }
init(clientProxy: ClientProxyProtocol, init(userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
mediaUploadingPreprocessor: MediaUploadingPreprocessor, mediaUploadingPreprocessor: MediaUploadingPreprocessor,
userIndicatorController: UserIndicatorControllerProtocol) { userIndicatorController: UserIndicatorControllerProtocol) {
self.clientProxy = clientProxy clientProxy = userSession.clientProxy
self.mediaUploadingPreprocessor = mediaUploadingPreprocessor self.mediaUploadingPreprocessor = mediaUploadingPreprocessor
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
super.init(initialViewState: UserDetailsEditScreenViewState(userID: clientProxy.userID, super.init(initialViewState: UserDetailsEditScreenViewState(userID: clientProxy.userID,
bindings: .init()), mediaProvider: mediaProvider) bindings: .init()), mediaProvider: userSession.mediaProvider)
clientProxy.userAvatarURLPublisher clientProxy.userAvatarURLPublisher
.receive(on: DispatchQueue.main) .receive(on: DispatchQueue.main)
@@ -115,8 +115,7 @@ struct UserDetailsEditScreen: View {
// MARK: - Previews // MARK: - Previews
struct UserDetailsEditScreen_Previews: PreviewProvider, TestablePreview { struct UserDetailsEditScreen_Previews: PreviewProvider, TestablePreview {
static let viewModel = UserDetailsEditScreenViewModel(clientProxy: ClientProxyMock(.init(userID: "@stefan:matrix.org")), static let viewModel = UserDetailsEditScreenViewModel(userSession: UserSessionMock(.init(clientProxy: ClientProxyMock(.init(userID: "@stefan:matrix.org")))),
mediaProvider: MediaProviderMock(configuration: .init()),
mediaUploadingPreprocessor: .init(appSettings: ServiceLocator.shared.settings), mediaUploadingPreprocessor: .init(appSettings: ServiceLocator.shared.settings),
userIndicatorController: UserIndicatorControllerMock.default) userIndicatorController: UserIndicatorControllerMock.default)
@@ -82,10 +82,9 @@ final class StartChatScreenCoordinator: CoordinatorProtocol {
// MARK: - Private // MARK: - Private
private func presentInviteUsersScreen() { private func presentInviteUsersScreen() {
let inviteParameters = InviteUsersScreenCoordinatorParameters(clientProxy: parameters.userSession.clientProxy, let inviteParameters = InviteUsersScreenCoordinatorParameters(userSession: parameters.userSession,
selectedUsers: selectedUsersPublisher, selectedUsers: selectedUsersPublisher,
roomType: .draft, roomType: .draft,
mediaProvider: parameters.userSession.mediaProvider,
userDiscoveryService: parameters.userDiscoveryService, userDiscoveryService: parameters.userDiscoveryService,
userIndicatorController: parameters.userIndicatorController) userIndicatorController: parameters.userIndicatorController)
let coordinator = InviteUsersScreenCoordinator(parameters: inviteParameters) let coordinator = InviteUsersScreenCoordinator(parameters: inviteParameters)
@@ -11,10 +11,9 @@ import SwiftUI
import WysiwygComposer import WysiwygComposer
struct ThreadTimelineScreenCoordinatorParameters { struct ThreadTimelineScreenCoordinatorParameters {
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let roomProxy: JoinedRoomProxyProtocol let roomProxy: JoinedRoomProxyProtocol
let timelineController: TimelineControllerProtocol let timelineController: TimelineControllerProtocol
let mediaProvider: MediaProviderProtocol
let mediaPlayerProvider: MediaPlayerProviderProtocol let mediaPlayerProvider: MediaPlayerProviderProtocol
let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
let emojiProvider: EmojiProviderProtocol let emojiProvider: EmojiProviderProtocol
@@ -60,7 +59,7 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol {
timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy, timelineViewModel = TimelineViewModel(roomProxy: parameters.roomProxy,
timelineController: parameters.timelineController, timelineController: parameters.timelineController,
mediaProvider: parameters.mediaProvider, userSession: parameters.userSession,
mediaPlayerProvider: parameters.mediaPlayerProvider, mediaPlayerProvider: parameters.mediaPlayerProvider,
voiceMessageMediaManager: parameters.voiceMessageMediaManager, voiceMessageMediaManager: parameters.voiceMessageMediaManager,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
@@ -68,8 +67,7 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol {
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
emojiProvider: parameters.emojiProvider, emojiProvider: parameters.emojiProvider,
timelineControllerFactory: parameters.timelineControllerFactory, timelineControllerFactory: parameters.timelineControllerFactory)
clientProxy: parameters.clientProxy)
let wysiwygViewModel = WysiwygComposerViewModel(minHeight: ComposerConstant.minHeight, let wysiwygViewModel = WysiwygComposerViewModel(minHeight: ComposerConstant.minHeight,
maxCompressedHeight: ComposerConstant.maxHeight, maxCompressedHeight: ComposerConstant.maxHeight,
@@ -80,7 +78,7 @@ final class ThreadTimelineScreenCoordinator: CoordinatorProtocol {
roomProxy: parameters.roomProxy, roomProxy: parameters.roomProxy,
wysiwygViewModel: wysiwygViewModel, wysiwygViewModel: wysiwygViewModel,
completionSuggestionService: parameters.completionSuggestionService, completionSuggestionService: parameters.completionSuggestionService,
mediaProvider: parameters.mediaProvider, mediaProvider: parameters.userSession.mediaProvider,
mentionDisplayHelper: ComposerMentionDisplayHelper(timelineContext: timelineViewModel.context), mentionDisplayHelper: ComposerMentionDisplayHelper(timelineContext: timelineViewModel.context),
appSettings: parameters.appSettings, appSettings: parameters.appSettings,
analyticsService: parameters.analytics, analyticsService: parameters.analytics,
@@ -33,7 +33,7 @@ enum TimelineInteractionHandlerAction {
class TimelineInteractionHandler { class TimelineInteractionHandler {
private let roomProxy: JoinedRoomProxyProtocol private let roomProxy: JoinedRoomProxyProtocol
private let timelineController: TimelineControllerProtocol private let timelineController: TimelineControllerProtocol
private let mediaProvider: MediaProviderProtocol private let userSession: UserSessionProtocol
private let mediaPlayerProvider: MediaPlayerProviderProtocol private let mediaPlayerProvider: MediaPlayerProviderProtocol
private let voiceMessageRecorder: VoiceMessageRecorderProtocol private let voiceMessageRecorder: VoiceMessageRecorderProtocol
private let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol private let voiceMessageMediaManager: VoiceMessageMediaManagerProtocol
@@ -44,7 +44,6 @@ class TimelineInteractionHandler {
private let emojiProvider: EmojiProviderProtocol private let emojiProvider: EmojiProviderProtocol
private let timelineControllerFactory: TimelineControllerFactoryProtocol private let timelineControllerFactory: TimelineControllerFactoryProtocol
private let pollInteractionHandler: PollInteractionHandlerProtocol private let pollInteractionHandler: PollInteractionHandlerProtocol
private let clientProxy: ClientProxyProtocol
private let actionsSubject: PassthroughSubject<TimelineInteractionHandlerAction, Never> = .init() private let actionsSubject: PassthroughSubject<TimelineInteractionHandlerAction, Never> = .init()
var actions: AnyPublisher<TimelineInteractionHandlerAction, Never> { var actions: AnyPublisher<TimelineInteractionHandlerAction, Never> {
@@ -61,7 +60,7 @@ class TimelineInteractionHandler {
init(roomProxy: JoinedRoomProxyProtocol, init(roomProxy: JoinedRoomProxyProtocol,
timelineController: TimelineControllerProtocol, timelineController: TimelineControllerProtocol,
mediaProvider: MediaProviderProtocol, userSession: UserSessionProtocol,
mediaPlayerProvider: MediaPlayerProviderProtocol, mediaPlayerProvider: MediaPlayerProviderProtocol,
voiceMessageMediaManager: VoiceMessageMediaManagerProtocol, voiceMessageMediaManager: VoiceMessageMediaManagerProtocol,
voiceMessageRecorder: VoiceMessageRecorderProtocol, voiceMessageRecorder: VoiceMessageRecorderProtocol,
@@ -70,11 +69,10 @@ class TimelineInteractionHandler {
appSettings: AppSettings, appSettings: AppSettings,
analyticsService: AnalyticsService, analyticsService: AnalyticsService,
emojiProvider: EmojiProviderProtocol, emojiProvider: EmojiProviderProtocol,
timelineControllerFactory: TimelineControllerFactoryProtocol, timelineControllerFactory: TimelineControllerFactoryProtocol) {
clientProxy: ClientProxyProtocol) {
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.timelineController = timelineController self.timelineController = timelineController
self.mediaProvider = mediaProvider self.userSession = userSession
self.mediaPlayerProvider = mediaPlayerProvider self.mediaPlayerProvider = mediaPlayerProvider
self.voiceMessageMediaManager = voiceMessageMediaManager self.voiceMessageMediaManager = voiceMessageMediaManager
self.voiceMessageRecorder = voiceMessageRecorder self.voiceMessageRecorder = voiceMessageRecorder
@@ -84,7 +82,6 @@ class TimelineInteractionHandler {
self.analyticsService = analyticsService self.analyticsService = analyticsService
self.emojiProvider = emojiProvider self.emojiProvider = emojiProvider
self.timelineControllerFactory = timelineControllerFactory self.timelineControllerFactory = timelineControllerFactory
self.clientProxy = clientProxy
pollInteractionHandler = PollInteractionHandler(analyticsService: analyticsService, pollInteractionHandler = PollInteractionHandler(analyticsService: analyticsService,
timelineController: timelineController) timelineController: timelineController)
@@ -582,14 +579,14 @@ class TimelineInteractionHandler {
presentation: newTimelinePresentation, presentation: newTimelinePresentation,
roomProxy: roomProxy, roomProxy: roomProxy,
timelineItemFactory: timelineItemFactory, timelineItemFactory: timelineItemFactory,
mediaProvider: mediaProvider) else { mediaProvider: userSession.mediaProvider) else {
MXLog.error("Failed presenting media timeline") MXLog.error("Failed presenting media timeline")
return .none return .none
} }
let timelineViewModel = TimelineViewModel(roomProxy: roomProxy, let timelineViewModel = TimelineViewModel(roomProxy: roomProxy,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: mediaProvider, userSession: userSession,
mediaPlayerProvider: mediaPlayerProvider, mediaPlayerProvider: mediaPlayerProvider,
voiceMessageMediaManager: voiceMessageMediaManager, voiceMessageMediaManager: voiceMessageMediaManager,
userIndicatorController: userIndicatorController, userIndicatorController: userIndicatorController,
@@ -597,8 +594,7 @@ class TimelineInteractionHandler {
appSettings: appSettings, appSettings: appSettings,
analyticsService: analyticsService, analyticsService: analyticsService,
emojiProvider: emojiProvider, emojiProvider: emojiProvider,
timelineControllerFactory: timelineControllerFactory, timelineControllerFactory: timelineControllerFactory)
clientProxy: clientProxy)
return .displayMediaPreview(item: item, timelineViewModel: .new(timelineViewModel)) return .displayMediaPreview(item: item, timelineViewModel: .new(timelineViewModel))
} else { } else {
@@ -23,7 +23,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
private let roomProxy: JoinedRoomProxyProtocol private let roomProxy: JoinedRoomProxyProtocol
private let timelineController: TimelineControllerProtocol private let timelineController: TimelineControllerProtocol
private let mediaProvider: MediaProviderProtocol private let userSession: UserSessionProtocol
private let mediaPlayerProvider: MediaPlayerProviderProtocol private let mediaPlayerProvider: MediaPlayerProviderProtocol
private let userIndicatorController: UserIndicatorControllerProtocol private let userIndicatorController: UserIndicatorControllerProtocol
private let appMediator: AppMediatorProtocol private let appMediator: AppMediatorProtocol
@@ -31,7 +31,6 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
private let analyticsService: AnalyticsService private let analyticsService: AnalyticsService
private let emojiProvider: EmojiProviderProtocol private let emojiProvider: EmojiProviderProtocol
private let timelineControllerFactory: TimelineControllerFactoryProtocol private let timelineControllerFactory: TimelineControllerFactoryProtocol
private let clientProxy: ClientProxyProtocol
private let timelineInteractionHandler: TimelineInteractionHandler private let timelineInteractionHandler: TimelineInteractionHandler
@@ -50,7 +49,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
init(roomProxy: JoinedRoomProxyProtocol, init(roomProxy: JoinedRoomProxyProtocol,
focussedEventID: String? = nil, focussedEventID: String? = nil,
timelineController: TimelineControllerProtocol, timelineController: TimelineControllerProtocol,
mediaProvider: MediaProviderProtocol, userSession: UserSessionProtocol,
mediaPlayerProvider: MediaPlayerProviderProtocol, mediaPlayerProvider: MediaPlayerProviderProtocol,
voiceMessageMediaManager: VoiceMessageMediaManagerProtocol, voiceMessageMediaManager: VoiceMessageMediaManagerProtocol,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol,
@@ -58,25 +57,23 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
appSettings: AppSettings, appSettings: AppSettings,
analyticsService: AnalyticsService, analyticsService: AnalyticsService,
emojiProvider: EmojiProviderProtocol, emojiProvider: EmojiProviderProtocol,
timelineControllerFactory: TimelineControllerFactoryProtocol, timelineControllerFactory: TimelineControllerFactoryProtocol) {
clientProxy: ClientProxyProtocol) {
self.timelineController = timelineController
self.mediaProvider = mediaProvider
self.mediaPlayerProvider = mediaPlayerProvider
self.roomProxy = roomProxy self.roomProxy = roomProxy
self.timelineController = timelineController
self.userSession = userSession
self.mediaPlayerProvider = mediaPlayerProvider
self.appSettings = appSettings self.appSettings = appSettings
self.analyticsService = analyticsService self.analyticsService = analyticsService
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
self.appMediator = appMediator self.appMediator = appMediator
self.emojiProvider = emojiProvider self.emojiProvider = emojiProvider
self.timelineControllerFactory = timelineControllerFactory self.timelineControllerFactory = timelineControllerFactory
self.clientProxy = clientProxy
let voiceMessageRecorder = VoiceMessageRecorder(audioRecorder: AudioRecorder(), mediaPlayerProvider: mediaPlayerProvider) let voiceMessageRecorder = VoiceMessageRecorder(audioRecorder: AudioRecorder(), mediaPlayerProvider: mediaPlayerProvider)
timelineInteractionHandler = TimelineInteractionHandler(roomProxy: roomProxy, timelineInteractionHandler = TimelineInteractionHandler(roomProxy: roomProxy,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: mediaProvider, userSession: userSession,
mediaPlayerProvider: mediaPlayerProvider, mediaPlayerProvider: mediaPlayerProvider,
voiceMessageMediaManager: voiceMessageMediaManager, voiceMessageMediaManager: voiceMessageMediaManager,
voiceMessageRecorder: voiceMessageRecorder, voiceMessageRecorder: voiceMessageRecorder,
@@ -85,10 +82,9 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
appSettings: appSettings, appSettings: appSettings,
analyticsService: analyticsService, analyticsService: analyticsService,
emojiProvider: emojiProvider, emojiProvider: emojiProvider,
timelineControllerFactory: timelineControllerFactory, timelineControllerFactory: timelineControllerFactory)
clientProxy: clientProxy)
let hideTimelineMedia = switch clientProxy.timelineMediaVisibilityPublisher.value { let hideTimelineMedia = switch userSession.clientProxy.timelineMediaVisibilityPublisher.value {
case .always: case .always:
false false
case .privateOnly: case .privateOnly:
@@ -109,7 +105,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
emojiProvider: emojiProvider, emojiProvider: emojiProvider,
mapTilerConfiguration: appSettings.mapTilerConfiguration, mapTilerConfiguration: appSettings.mapTilerConfiguration,
bindings: .init(reactionsCollapsed: [:])), bindings: .init(reactionsCollapsed: [:])),
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
if focussedEventID != nil { if focussedEventID != nil {
// The timeline controller will start loading a detached timeline. // The timeline controller will start loading a detached timeline.
@@ -132,11 +128,11 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
} }
state.roomNameForIDResolver = { [weak self] roomID in state.roomNameForIDResolver = { [weak self] roomID in
self?.clientProxy.roomSummaryForIdentifier(roomID)?.name self?.userSession.clientProxy.roomSummaryForIdentifier(roomID)?.name
} }
state.roomNameForAliasResolver = { [weak self] alias in state.roomNameForAliasResolver = { [weak self] alias in
self?.clientProxy.roomSummaryForAlias(alias)?.name self?.userSession.clientProxy.roomSummaryForAlias(alias)?.name
} }
state.timelineState.paginationState = timelineController.paginationState state.timelineState.paginationState = timelineController.paginationState
@@ -290,7 +286,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
roomProxy: roomProxy, roomProxy: roomProxy,
userIndicatorController: userIndicatorController, userIndicatorController: userIndicatorController,
analyticsService: analyticsService, analyticsService: analyticsService,
mediaProvider: mediaProvider) mediaProvider: userSession.mediaProvider)
viewModel.actions.sink { [weak self] action in viewModel.actions.sink { [weak self] action in
guard let self else { return } guard let self else { return }
@@ -509,7 +505,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
.weakAssign(to: \.state.areThreadsEnabled, on: self) .weakAssign(to: \.state.areThreadsEnabled, on: self)
.store(in: &cancellables) .store(in: &cancellables)
clientProxy.timelineMediaVisibilityPublisher userSession.clientProxy.timelineMediaVisibilityPublisher
.removeDuplicates() .removeDuplicates()
.flatMap { [weak self] timelineMediaVisibility -> AnyPublisher<Bool, Never> in .flatMap { [weak self] timelineMediaVisibility -> AnyPublisher<Bool, Never> in
switch timelineMediaVisibility { switch timelineMediaVisibility {
@@ -738,7 +734,7 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
return TimelineMediaPreviewViewModel(initialItem: item, return TimelineMediaPreviewViewModel(initialItem: item,
timelineViewModel: timelineViewModel, timelineViewModel: timelineViewModel,
mediaProvider: mediaProvider, mediaProvider: userSession.mediaProvider,
photoLibraryManager: PhotoLibraryManager(), photoLibraryManager: PhotoLibraryManager(),
userIndicatorController: userIndicatorController, userIndicatorController: userIndicatorController,
appMediator: appMediator) appMediator: appMediator)
@@ -928,18 +924,18 @@ class TimelineViewModel: TimelineViewModelType, TimelineViewModelProtocol {
let pillViewState: PillViewState let pillViewState: PillViewState
switch room { switch room {
case .roomAlias(let alias): case .roomAlias(let alias):
let roomSummary = clientProxy.roomSummaryForAlias(alias) let roomSummary = userSession.clientProxy.roomSummaryForAlias(alias)
pillViewState = .reference(displayText: PillUtilities.eventPillDisplayText(roomName: roomSummary?.name, rawRoomText: alias)) pillViewState = .reference(displayText: PillUtilities.eventPillDisplayText(roomName: roomSummary?.name, rawRoomText: alias))
case .roomID(let id): case .roomID(let id):
let roomSummary = clientProxy.roomSummaryForIdentifier(id) let roomSummary = userSession.clientProxy.roomSummaryForIdentifier(id)
pillViewState = .reference(displayText: PillUtilities.eventPillDisplayText(roomName: roomSummary?.name, rawRoomText: id)) pillViewState = .reference(displayText: PillUtilities.eventPillDisplayText(roomName: roomSummary?.name, rawRoomText: id))
} }
pillContext.viewState = pillViewState pillContext.viewState = pillViewState
case .roomAlias(let alias): case .roomAlias(let alias):
let roomSummary = clientProxy.roomSummaryForAlias(alias) let roomSummary = userSession.clientProxy.roomSummaryForAlias(alias)
pillContext.viewState = .reference(displayText: PillUtilities.roomPillDisplayText(roomName: roomSummary?.name, rawRoomText: alias)) pillContext.viewState = .reference(displayText: PillUtilities.roomPillDisplayText(roomName: roomSummary?.name, rawRoomText: alias))
case .roomID(let id): case .roomID(let id):
let roomSummary = clientProxy.roomSummaryForIdentifier(id) let roomSummary = userSession.clientProxy.roomSummaryForIdentifier(id)
pillContext.viewState = .reference(displayText: PillUtilities.roomPillDisplayText(roomName: roomSummary?.name, rawRoomText: id)) pillContext.viewState = .reference(displayText: PillUtilities.roomPillDisplayText(roomName: roomSummary?.name, rawRoomText: id))
} }
} }
@@ -1003,7 +999,7 @@ extension TimelineViewModel {
return TimelineViewModel(roomProxy: roomProxy, return TimelineViewModel(roomProxy: roomProxy,
focussedEventID: nil, focussedEventID: nil,
timelineController: timelineController ?? MockTimelineController(timelineKind: timelineKind), timelineController: timelineController ?? MockTimelineController(timelineKind: timelineKind),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init(clientProxy: clientProxyMock)),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -1011,8 +1007,7 @@ extension TimelineViewModel {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: clientProxyMock)
} }
} }
@@ -45,7 +45,7 @@ struct ReadReceiptsSummaryView_Previews: PreviewProvider, TestablePreview {
let roomProxyMock = JoinedRoomProxyMock(.init(name: "Room", members: members)) let roomProxyMock = JoinedRoomProxyMock(.init(name: "Room", members: members))
let mock = TimelineViewModel(roomProxy: roomProxyMock, let mock = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: UserIndicatorControllerMock(), userIndicatorController: UserIndicatorControllerMock(),
@@ -53,8 +53,7 @@ struct ReadReceiptsSummaryView_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
return mock return mock
}() }()
@@ -334,7 +334,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
return TimelineViewModel(roomProxy: roomProxy, return TimelineViewModel(roomProxy: roomProxy,
focussedEventID: nil, focussedEventID: nil,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -342,8 +342,7 @@ struct TimelineItemBubbledStylerView_Previews: PreviewProvider, TestablePreview
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
}() }()
static var previews: some View { static var previews: some View {
@@ -80,7 +80,7 @@ struct TimelineReadReceiptsView_Previews: PreviewProvider, TestablePreview {
static let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Test", members: members)), static let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "Test", members: members)),
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -88,8 +88,7 @@ struct TimelineReadReceiptsView_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
static let singleReceipt = [ReadReceipt(userID: RoomMemberProxyMock.mockAlice.userID, formattedTimestamp: "Now")] static let singleReceipt = [ReadReceipt(userID: RoomMemberProxyMock.mockAlice.userID, formattedTimestamp: "Now")]
static let doubleReceipt = [ReadReceipt(userID: RoomMemberProxyMock.mockAlice.userID, formattedTimestamp: "Now"), static let doubleReceipt = [ReadReceipt(userID: RoomMemberProxyMock.mockAlice.userID, formattedTimestamp: "Now"),
@@ -90,7 +90,7 @@ struct HighlightedTimelineItemTimeline_Previews: PreviewProvider {
static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock,
focussedEventID: focussedEventID, focussedEventID: focussedEventID,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -98,8 +98,7 @@ struct HighlightedTimelineItemTimeline_Previews: PreviewProvider {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
static var previews: some View { static var previews: some View {
NavigationStack { NavigationStack {
@@ -142,7 +142,7 @@ struct TimelineView_Previews: PreviewProvider, TestablePreview {
static let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock) static let roomViewModel = RoomScreenViewModel.mock(roomProxyMock: roomProxyMock)
static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock, static let timelineViewModel = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -150,8 +150,7 @@ struct TimelineView_Previews: PreviewProvider, TestablePreview {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
static var previews: some View { static var previews: some View {
NavigationStack { NavigationStack {
@@ -11,8 +11,7 @@ import SwiftUI
struct UserProfileScreenCoordinatorParameters { struct UserProfileScreenCoordinatorParameters {
let userID: String let userID: String
let isPresentedModally: Bool let isPresentedModally: Bool
let clientProxy: ClientProxyProtocol let userSession: UserSessionProtocol
let mediaProvider: MediaProviderProtocol
let userIndicatorController: UserIndicatorControllerProtocol let userIndicatorController: UserIndicatorControllerProtocol
let analytics: AnalyticsService let analytics: AnalyticsService
} }
@@ -36,8 +35,7 @@ final class UserProfileScreenCoordinator: CoordinatorProtocol {
init(parameters: UserProfileScreenCoordinatorParameters) { init(parameters: UserProfileScreenCoordinatorParameters) {
viewModel = UserProfileScreenViewModel(userID: parameters.userID, viewModel = UserProfileScreenViewModel(userID: parameters.userID,
isPresentedModally: parameters.isPresentedModally, isPresentedModally: parameters.isPresentedModally,
clientProxy: parameters.clientProxy, userSession: parameters.userSession,
mediaProvider: parameters.mediaProvider,
userIndicatorController: parameters.userIndicatorController, userIndicatorController: parameters.userIndicatorController,
analytics: parameters.analytics) analytics: parameters.analytics)
} }
@@ -12,8 +12,7 @@ import SwiftUI
typealias UserProfileScreenViewModelType = StateStoreViewModelV2<UserProfileScreenViewState, UserProfileScreenViewAction> typealias UserProfileScreenViewModelType = StateStoreViewModelV2<UserProfileScreenViewState, UserProfileScreenViewAction>
class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScreenViewModelProtocol { class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScreenViewModelProtocol {
private let clientProxy: ClientProxyProtocol private let userSession: UserSessionProtocol
private let mediaProvider: MediaProviderProtocol
private let userIndicatorController: UserIndicatorControllerProtocol private let userIndicatorController: UserIndicatorControllerProtocol
private let analytics: AnalyticsService private let analytics: AnalyticsService
@@ -24,21 +23,19 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr
init(userID: String, init(userID: String,
isPresentedModally: Bool, isPresentedModally: Bool,
clientProxy: ClientProxyProtocol, userSession: UserSessionProtocol,
mediaProvider: MediaProviderProtocol,
userIndicatorController: UserIndicatorControllerProtocol, userIndicatorController: UserIndicatorControllerProtocol,
analytics: AnalyticsService) { analytics: AnalyticsService) {
self.clientProxy = clientProxy self.userSession = userSession
self.mediaProvider = mediaProvider
self.userIndicatorController = userIndicatorController self.userIndicatorController = userIndicatorController
self.analytics = analytics self.analytics = analytics
let initialViewState = UserProfileScreenViewState(userID: userID, let initialViewState = UserProfileScreenViewState(userID: userID,
isOwnUser: userID == clientProxy.userID, isOwnUser: userID == userSession.clientProxy.userID,
isPresentedModally: isPresentedModally, isPresentedModally: isPresentedModally,
bindings: .init()) bindings: .init())
super.init(initialViewState: initialViewState, mediaProvider: mediaProvider) super.init(initialViewState: initialViewState, mediaProvider: userSession.mediaProvider)
showLoadingIndicator(allowsInteraction: true) showLoadingIndicator(allowsInteraction: true)
Task { Task {
@@ -74,15 +71,15 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr
// MARK: - Private // MARK: - Private
private func loadProfile() async { private func loadProfile() async {
async let profileResult = clientProxy.profile(for: state.userID) async let profileResult = userSession.clientProxy.profile(for: state.userID)
async let identityResult = clientProxy.userIdentity(for: state.userID) async let identityResult = userSession.clientProxy.userIdentity(for: state.userID)
switch await profileResult { switch await profileResult {
case .success(let userProfile): case .success(let userProfile):
state.userProfile = userProfile state.userProfile = userProfile
state.permalink = (try? matrixToUserPermalink(userId: state.userID)).flatMap(URL.init(string:)) state.permalink = (try? matrixToUserPermalink(userId: state.userID)).flatMap(URL.init(string:))
switch clientProxy.directRoomForUserID(userProfile.userID) { switch userSession.clientProxy.directRoomForUserID(userProfile.userID) {
case .success(let roomID): case .success(let roomID):
state.dmRoomID = roomID state.dmRoomID = roomID
case .failure: case .failure:
@@ -108,7 +105,7 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr
// We don't actually know the mime type here, assume it's an image. // We don't actually know the mime type here, assume it's an image.
if let mediaSource = try? MediaSourceProxy(url: url, mimeType: "image/jpeg"), if let mediaSource = try? MediaSourceProxy(url: url, mimeType: "image/jpeg"),
case let .success(file) = await mediaProvider.loadFileFromSource(mediaSource) { case let .success(file) = await userSession.mediaProvider.loadFileFromSource(mediaSource) {
state.bindings.mediaPreviewItem = MediaPreviewItem(file: file, title: userProfile.displayName) state.bindings.mediaPreviewItem = MediaPreviewItem(file: file, title: userProfile.displayName)
} }
} }
@@ -119,7 +116,7 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr
showLoadingIndicator(allowsInteraction: false) showLoadingIndicator(allowsInteraction: false)
defer { hideLoadingIndicator() } defer { hideLoadingIndicator() }
switch clientProxy.directRoomForUserID(userProfile.userID) { switch userSession.clientProxy.directRoomForUserID(userProfile.userID) {
case .success(let roomID): case .success(let roomID):
if let roomID { if let roomID {
actionsSubject.send(.openDirectChat(roomID: roomID)) actionsSubject.send(.openDirectChat(roomID: roomID))
@@ -137,7 +134,7 @@ class UserProfileScreenViewModel: UserProfileScreenViewModelType, UserProfileScr
showLoadingIndicator(allowsInteraction: false) showLoadingIndicator(allowsInteraction: false)
defer { hideLoadingIndicator() } defer { hideLoadingIndicator() }
switch await clientProxy.createDirectRoom(with: userProfile.userID, expectedRoomName: userProfile.displayName) { switch await userSession.clientProxy.createDirectRoom(with: userProfile.userID, expectedRoomName: userProfile.displayName) {
case .success(let roomID): case .success(let roomID):
analytics.trackCreatedRoom(isDM: true) analytics.trackCreatedRoom(isDM: true)
actionsSubject.send(.openDirectChat(roomID: roomID)) actionsSubject.send(.openDirectChat(roomID: roomID))
@@ -135,8 +135,7 @@ struct UserProfileScreen_Previews: PreviewProvider, TestablePreview {
return UserProfileScreenViewModel(userID: userID, return UserProfileScreenViewModel(userID: userID,
isPresentedModally: false, isPresentedModally: false,
clientProxy: clientProxyMock, userSession: UserSessionMock(.init(clientProxy: clientProxyMock)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
} }
@@ -259,10 +259,9 @@ class MockScreen: Identifiable {
return navigationStackCoordinator return navigationStackCoordinator
case .roomPlainNoAvatar: case .roomPlainNoAvatar:
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Some room name", avatarURL: nil)), roomProxy: JoinedRoomProxyMock(.init(name: "Some room name", avatarURL: nil)),
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -282,10 +281,9 @@ class MockScreen: Identifiable {
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -305,10 +303,9 @@ class MockScreen: Identifiable {
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.default timelineController.timelineItems = RoomTimelineItemFixtures.default
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -327,10 +324,9 @@ class MockScreen: Identifiable {
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.smallChunkWithReadReceipts timelineController.timelineItems = RoomTimelineItemFixtures.smallChunkWithReadReceipts
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "New room", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -352,10 +348,9 @@ class MockScreen: Identifiable {
timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk
timelineController.backPaginationResponses = [RoomTimelineItemFixtures.singleMessageChunk] timelineController.backPaginationResponses = [RoomTimelineItemFixtures.singleMessageChunk]
timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage] timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage]
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Small timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Small timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -377,10 +372,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController(listenForSignals: true) let timelineController = MockTimelineController(listenForSignals: true)
timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk timelineController.timelineItems = RoomTimelineItemFixtures.smallChunk
timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk] timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk]
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Small timeline, paginating", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Small timeline, paginating", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -401,10 +395,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController(listenForSignals: true) let timelineController = MockTimelineController(listenForSignals: true)
timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk
timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk] timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk]
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -427,10 +420,9 @@ class MockScreen: Identifiable {
timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk
timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk] timelineController.backPaginationResponses = [RoomTimelineItemFixtures.largeChunk]
timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage] timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage]
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -452,10 +444,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController(listenForSignals: true) let timelineController = MockTimelineController(listenForSignals: true)
timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk timelineController.timelineItems = RoomTimelineItemFixtures.largeChunk
timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage] timelineController.incomingItems = [RoomTimelineItemFixtures.incomingMessage]
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Large timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -476,10 +467,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.permalinkChunk timelineController.timelineItems = RoomTimelineItemFixtures.permalinkChunk
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Timeline highlight", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Timeline highlight", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -514,10 +504,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.disclosedPolls timelineController.timelineItems = RoomTimelineItemFixtures.disclosedPolls
timelineController.incomingItems = [] timelineController.incomingItems = []
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -539,10 +528,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.undisclosedPolls timelineController.timelineItems = RoomTimelineItemFixtures.undisclosedPolls
timelineController.incomingItems = [] timelineController.incomingItems = []
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -564,10 +552,9 @@ class MockScreen: Identifiable {
let timelineController = MockTimelineController() let timelineController = MockTimelineController()
timelineController.timelineItems = RoomTimelineItemFixtures.outgoingPolls timelineController.timelineItems = RoomTimelineItemFixtures.outgoingPolls
timelineController.incomingItems = [] timelineController.incomingItems = []
let parameters = RoomScreenCoordinatorParameters(clientProxy: ClientProxyMock(.init()), let parameters = RoomScreenCoordinatorParameters(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: .mockMXCAvatar)), roomProxy: JoinedRoomProxyMock(.init(name: "Polls timeline", avatarURL: .mockMXCAvatar)),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
@@ -631,9 +618,8 @@ class MockScreen: Identifiable {
case .roomMembersListScreenPendingInvites: case .roomMembersListScreenPendingInvites:
let navigationStackCoordinator = NavigationStackCoordinator() let navigationStackCoordinator = NavigationStackCoordinator()
let members: [RoomMemberProxyMock] = [.mockInvitedAlice, .mockBob, .mockCharlie] let members: [RoomMemberProxyMock] = [.mockInvitedAlice, .mockBob, .mockCharlie]
let coordinator = RoomMembersListScreenCoordinator(parameters: .init(clientProxy: ClientProxyMock(.init()), let coordinator = RoomMembersListScreenCoordinator(parameters: .init(userSession: UserSessionMock(.init()),
roomProxy: JoinedRoomProxyMock(.init(name: "test", members: members)), roomProxy: JoinedRoomProxyMock(.init(name: "test", members: members)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics)) analytics: ServiceLocator.shared.analytics))
navigationStackCoordinator.setRootCoordinator(coordinator) navigationStackCoordinator.setRootCoordinator(coordinator)
@@ -16,8 +16,7 @@ class BlockedUsersScreenViewModelTests: XCTestCase {
let clientProxy = ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID)) let clientProxy = ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID))
let viewModel = BlockedUsersScreenViewModel(hideProfiles: true, let viewModel = BlockedUsersScreenViewModel(hideProfiles: true,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController) userIndicatorController: ServiceLocator.shared.userIndicatorController)
let deferred = deferFailure(viewModel.context.observe(\.viewState.blockedUsers), timeout: 1) { $0.contains { $0.displayName != nil } } let deferred = deferFailure(viewModel.context.observe(\.viewState.blockedUsers), timeout: 1) { $0.contains { $0.displayName != nil } }
@@ -31,8 +30,7 @@ class BlockedUsersScreenViewModelTests: XCTestCase {
let clientProxy = ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID)) let clientProxy = ClientProxyMock(.init(userID: RoomMemberProxyMock.mockMe.userID))
let viewModel = BlockedUsersScreenViewModel(hideProfiles: false, let viewModel = BlockedUsersScreenViewModel(hideProfiles: false,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController) userIndicatorController: ServiceLocator.shared.userIndicatorController)
let deferred = deferFulfillment(viewModel.context.observe(\.viewState.blockedUsers)) { $0.contains { $0.displayName != nil } } let deferred = deferFulfillment(viewModel.context.observe(\.viewState.blockedUsers)) { $0.contains { $0.displayName != nil } }
@@ -89,10 +89,9 @@ class InviteUsersScreenViewModelTests: XCTestCase {
userDiscoveryService = UserDiscoveryServiceMock() userDiscoveryService = UserDiscoveryServiceMock()
userDiscoveryService.searchProfilesWithReturnValue = .success([]) userDiscoveryService.searchProfilesWithReturnValue = .success([])
usersSubject.send([]) usersSubject.send([])
let viewModel = InviteUsersScreenViewModel(clientProxy: ClientProxyMock(.init()), let viewModel = InviteUsersScreenViewModel(userSession: UserSessionMock(.init()),
selectedUsers: usersSubject.asCurrentValuePublisher(), selectedUsers: usersSubject.asCurrentValuePublisher(),
roomType: roomType, roomType: roomType,
mediaProvider: MediaProviderMock(configuration: .init()),
userDiscoveryService: userDiscoveryService, userDiscoveryService: userDiscoveryService,
userIndicatorController: UserIndicatorControllerMock()) userIndicatorController: UserIndicatorControllerMock())
viewModel.state.usersSection = .init(type: .suggestions, users: [.mockAlice, .mockBob, .mockCharlie]) viewModel.state.usersSection = .init(type: .suggestions, users: [.mockAlice, .mockBob, .mockCharlie])
@@ -195,8 +195,7 @@ class JoinRoomScreenViewModelTests: XCTestCase {
viewModel = JoinRoomScreenViewModel(roomID: "1", viewModel = JoinRoomScreenViewModel(roomID: "1",
via: [], via: [],
appSettings: appSettings, appSettings: appSettings,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController) userIndicatorController: ServiceLocator.shared.userIndicatorController)
} }
} }
@@ -26,10 +26,9 @@ class MessageForwardingScreenViewModelTests: XCTestCase {
clientProxy.roomForIdentifierClosure = { .joined(JoinedRoomProxyMock(.init(id: $0))) } clientProxy.roomForIdentifierClosure = { .joined(JoinedRoomProxyMock(.init(id: $0))) }
viewModel = MessageForwardingScreenViewModel(forwardingItem: forwardingItem, viewModel = MessageForwardingScreenViewModel(forwardingItem: forwardingItem,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))), roomSummaryProvider: RoomSummaryProviderMock(.init(state: .loaded(.mockRooms))),
userIndicatorController: UserIndicatorControllerMock(), userIndicatorController: UserIndicatorControllerMock())
mediaProvider: MediaProviderMock(configuration: .init()))
context = viewModel.context context = viewModel.context
} }
@@ -160,7 +160,7 @@ final class NotificationManagerTests: XCTestCase {
notificationCenter.authorizationStatusReturnValue = .authorized notificationCenter.authorizationStatusReturnValue = .authorized
notificationManager.delegate = self notificationManager.delegate = self
notificationManager.setUserSession(UserSessionMock(.init(clientProxy: ClientProxyMock(.init())))) notificationManager.setUserSession(UserSessionMock(.init()))
try await Task.sleep(for: .seconds(1)) try await Task.sleep(for: .seconds(1))
XCTAssertFalse(authorizationStatusWasGranted) XCTAssertFalse(authorizationStatusWasGranted)
@@ -177,7 +177,7 @@ final class NotificationManagerTests: XCTestCase {
expectation.fulfill() expectation.fulfill()
} }
notificationManager.setUserSession(UserSessionMock(.init(clientProxy: ClientProxyMock(.init())))) notificationManager.setUserSession(UserSessionMock(.init()))
await fulfillment(of: [expectation]) await fulfillment(of: [expectation])
XCTAssertTrue(authorizationStatusWasGranted) XCTAssertTrue(authorizationStatusWasGranted)
+22 -33
View File
@@ -19,7 +19,7 @@ class PillContextTests: XCTestCase {
proxyMock.membersPublisher = subject.asCurrentValuePublisher() proxyMock.membersPublisher = subject.asCurrentValuePublisher()
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -27,8 +27,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .user(userID: id), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .user(userID: id), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -50,7 +49,7 @@ class PillContextTests: XCTestCase {
proxyMock.membersPublisher = subject.asCurrentValuePublisher() proxyMock.membersPublisher = subject.asCurrentValuePublisher()
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -58,8 +57,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .user(userID: id), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .user(userID: id), font: .preferredFont(forTextStyle: .body)))
XCTAssertTrue(context.viewState.isOwnMention) XCTAssertTrue(context.viewState.isOwnMention)
@@ -74,7 +72,7 @@ class PillContextTests: XCTestCase {
mockController.roomProxy = proxyMock mockController.roomProxy = proxyMock
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -82,8 +80,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .allUsers, font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .allUsers, font: .preferredFont(forTextStyle: .body)))
XCTAssertTrue(context.viewState.isOwnMention) XCTAssertTrue(context.viewState.isOwnMention)
@@ -98,7 +95,7 @@ class PillContextTests: XCTestCase {
mockController.roomProxy = proxyMock mockController.roomProxy = proxyMock
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init(clientProxy: clientMock)),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -106,8 +103,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: clientMock)
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomID("1"), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomID("1"), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -121,7 +117,7 @@ class PillContextTests: XCTestCase {
mockController.roomProxy = proxyMock mockController.roomProxy = proxyMock
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -129,8 +125,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomID("1"), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomID("1"), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -148,7 +143,7 @@ class PillContextTests: XCTestCase {
canonicalAlias: "#foundation-and-empire:matrix.org") canonicalAlias: "#foundation-and-empire:matrix.org")
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init(clientProxy: clientMock)),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -156,8 +151,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: clientMock)
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomAlias("#foundation-and-empire:matrix.org"), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomAlias("#foundation-and-empire:matrix.org"), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -171,7 +165,7 @@ class PillContextTests: XCTestCase {
mockController.roomProxy = proxyMock mockController.roomProxy = proxyMock
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -179,8 +173,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomAlias("#foundation-and-empire:matrix.org"), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .roomAlias("#foundation-and-empire:matrix.org"), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -196,7 +189,7 @@ class PillContextTests: XCTestCase {
clientMock.roomSummaryForIdentifierReturnValue = .mock(id: "1", name: "Foundation 🔭🪐🌌") clientMock.roomSummaryForIdentifierReturnValue = .mock(id: "1", name: "Foundation 🔭🪐🌌")
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init(clientProxy: clientMock)),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -204,8 +197,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: clientMock)
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomID("1")), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomID("1")), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -219,7 +211,7 @@ class PillContextTests: XCTestCase {
mockController.roomProxy = proxyMock mockController.roomProxy = proxyMock
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -227,8 +219,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomID("1")), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomID("1")), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -246,7 +237,7 @@ class PillContextTests: XCTestCase {
canonicalAlias: "#foundation-and-empire:matrix.org") canonicalAlias: "#foundation-and-empire:matrix.org")
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init(clientProxy: clientMock)),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -254,8 +245,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: clientMock)
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomAlias("#foundation-and-empire:matrix.org")), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomAlias("#foundation-and-empire:matrix.org")), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -269,7 +259,7 @@ class PillContextTests: XCTestCase {
mockController.roomProxy = proxyMock mockController.roomProxy = proxyMock
let mock = TimelineViewModel(roomProxy: proxyMock, let mock = TimelineViewModel(roomProxy: proxyMock,
timelineController: mockController, timelineController: mockController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
@@ -277,8 +267,7 @@ class PillContextTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomAlias("#foundation-and-empire:matrix.org")), font: .preferredFont(forTextStyle: .body))) let context = PillContext(timelineContext: mock.context, data: PillTextAttachmentData(type: .event(room: .roomAlias("#foundation-and-empire:matrix.org")), font: .preferredFont(forTextStyle: .body)))
XCTAssertFalse(context.viewState.isOwnMention) XCTAssertFalse(context.viewState.isOwnMention)
@@ -111,8 +111,7 @@ class RoomDetailsEditScreenViewModelTests: XCTestCase {
private func setupViewModel(roomProxyConfiguration: JoinedRoomProxyMockConfiguration) { private func setupViewModel(roomProxyConfiguration: JoinedRoomProxyMockConfiguration) {
userIndicatorController = UserIndicatorControllerMock.default userIndicatorController = UserIndicatorControllerMock.default
viewModel = .init(roomProxy: JoinedRoomProxyMock(roomProxyConfiguration), viewModel = .init(roomProxy: JoinedRoomProxyMock(roomProxyConfiguration),
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings), mediaUploadingPreprocessor: MediaUploadingPreprocessor(appSettings: ServiceLocator.shared.settings),
userIndicatorController: userIndicatorController) userIndicatorController: userIndicatorController)
} }
@@ -27,8 +27,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test")) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test"))
notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()) notificationSettingsProxyMock = NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration())
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxyMock, notificationSettingsProxy: notificationSettingsProxyMock,
@@ -41,8 +40,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers, joinRule: .public)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers, joinRule: .public))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -62,8 +60,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -84,8 +81,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -138,8 +134,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -160,8 +155,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -192,8 +186,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
clientProxy.ignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) clientProxy.ignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -223,8 +216,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient] let mockedMembers: [RoomMemberProxyMock] = [.mockMe, recipient]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -255,8 +247,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
clientProxy.unignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) clientProxy.unignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, isEncrypted: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -288,8 +279,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
joinRule: .public, joinRule: .public,
powerLevelsConfiguration: .init(canUserInvite: false))) powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -306,8 +296,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers, joinRule: .public)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", members: mockedMembers, joinRule: .public))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -359,8 +348,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
roomProxyMock.infoPublisher = CurrentValueSubject(roomInfoProxyMock).asCurrentValuePublisher() roomProxyMock.infoPublisher = CurrentValueSubject(roomInfoProxyMock).asCurrentValuePublisher()
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -399,8 +387,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
roomProxyMock.infoPublisher = CurrentValueSubject(roomInfoProxyMock).asCurrentValuePublisher() roomProxyMock.infoPublisher = CurrentValueSubject(roomInfoProxyMock).asCurrentValuePublisher()
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -439,8 +426,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
roomProxyMock.infoPublisher = CurrentValueSubject(roomInfoProxyMock).asCurrentValuePublisher() roomProxyMock.infoPublisher = CurrentValueSubject(roomInfoProxyMock).asCurrentValuePublisher()
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -460,8 +446,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -481,8 +466,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMeAdmin, .mockBob, .mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockMeAdmin, .mockBob, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, members: mockedMembers)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, members: mockedMembers))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()), notificationSettingsProxy: NotificationSettingsProxyMock(with: NotificationSettingsProxyMockConfiguration()),
@@ -500,8 +484,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
func testNotificationLoadingSettingsFailure() async throws { func testNotificationLoadingSettingsFailure() async throws {
notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneThrowableError = NotificationSettingsError.Generic(msg: "error") notificationSettingsProxyMock.getNotificationSettingsRoomIdIsEncryptedIsOneToOneThrowableError = NotificationSettingsError.Generic(msg: "error")
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxyMock, notificationSettingsProxy: notificationSettingsProxyMock,
@@ -694,8 +677,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedRequests: [KnockRequestProxyMock] = [.init(), .init()] let mockedRequests: [KnockRequestProxyMock] = [.init(), .init()]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, knockRequestsState: .loaded(mockedRequests), joinRule: .knock)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, knockRequestsState: .loaded(mockedRequests), joinRule: .knock))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxyMock, notificationSettingsProxy: notificationSettingsProxyMock,
@@ -717,8 +699,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
ServiceLocator.shared.settings.knockingEnabled = true ServiceLocator.shared.settings.knockingEnabled = true
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, knockRequestsState: .loading, joinRule: .knock)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: false, knockRequestsState: .loading, joinRule: .knock))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxyMock, notificationSettingsProxy: notificationSettingsProxyMock,
@@ -742,8 +723,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
joinRule: .knock, joinRule: .knock,
powerLevelsConfiguration: .init(canUserInvite: false))) powerLevelsConfiguration: .init(canUserInvite: false)))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxyMock, notificationSettingsProxy: notificationSettingsProxyMock,
@@ -767,8 +747,7 @@ class RoomDetailsScreenViewModelTests: XCTestCase {
let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockAlice] let mockedMembers: [RoomMemberProxyMock] = [.mockMe, .mockAlice]
roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, members: mockedMembers, knockRequestsState: .loaded(mockedRequests), joinRule: .knock)) roomProxyMock = JoinedRoomProxyMock(.init(name: "Test", isDirect: true, members: mockedMembers, knockRequestsState: .loaded(mockedRequests), joinRule: .knock))
viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock, viewModel = RoomDetailsScreenViewModel(roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
notificationSettingsProxy: notificationSettingsProxyMock, notificationSettingsProxy: notificationSettingsProxyMock,
@@ -28,8 +28,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
roomMemberProxyMock = RoomMemberProxyMock.mockAlice roomMemberProxyMock = RoomMemberProxyMock.mockAlice
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -45,8 +44,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
roomMemberProxyMock = RoomMemberProxyMock.mockAlice roomMemberProxyMock = RoomMemberProxyMock.mockAlice
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -83,8 +81,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
clientProxy.ignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) clientProxy.ignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -120,8 +117,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -156,8 +152,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
clientProxy.unignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic)) clientProxy.unignoreUserReturnValue = .failure(.sdkError(ClientProxyMockError.generic))
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -192,8 +187,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
roomMemberProxyMock = RoomMemberProxyMock.mockMe roomMemberProxyMock = RoomMemberProxyMock.mockMe
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -209,8 +203,7 @@ class RoomMemberDetailsViewModelTests: XCTestCase {
roomMemberProxyMock = RoomMemberProxyMock.mockIgnored roomMemberProxyMock = RoomMemberProxyMock.mockIgnored
viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID, viewModel = RoomMemberDetailsScreenViewModel(userID: roomMemberProxyMock.userID,
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
clientProxy: ClientProxyMock(.init()), userSession: UserSessionMock(.init()),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -274,9 +274,8 @@ class RoomMembersListScreenViewModelTests: XCTestCase {
private func setup(with members: [RoomMemberProxyMock]) { private func setup(with members: [RoomMemberProxyMock]) {
roomProxy = JoinedRoomProxyMock(.init(name: "test", members: members)) roomProxy = JoinedRoomProxyMock(.init(name: "test", members: members))
viewModel = .init(clientProxy: ClientProxyMock(.init()), viewModel = .init(userSession: UserSessionMock(.init()),
roomProxy: roomProxy, roomProxy: roomProxy,
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
} }
@@ -38,10 +38,9 @@ class RoomScreenViewModelTests: XCTestCase {
} }
// setup the room proxy actions publisher // setup the room proxy actions publisher
roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher() roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher()
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -119,10 +118,9 @@ class RoomScreenViewModelTests: XCTestCase {
.event(.init(item: EventTimelineItem(configuration: .init(eventID: "test2")), uniqueID: .init("2"))), .event(.init(item: EventTimelineItem(configuration: .init(eventID: "test2")), uniqueID: .init("2"))),
.event(.init(item: EventTimelineItem(configuration: .init(eventID: "test3")), uniqueID: .init("3")))] .event(.init(item: EventTimelineItem(configuration: .init(eventID: "test3")), uniqueID: .init("3")))]
roomProxyMock.pinnedEventsTimelineReturnValue = .success(pinnedTimelineMock) roomProxyMock.pinnedEventsTimelineReturnValue = .success(pinnedTimelineMock)
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: "test1", initialSelectedPinnedEventID: "test1",
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -178,10 +176,9 @@ class RoomScreenViewModelTests: XCTestCase {
let infoSubject = CurrentValueSubject<RoomInfoProxyProtocol, Never>(roomInfoProxyMock) let infoSubject = CurrentValueSubject<RoomInfoProxyProtocol, Never>(roomInfoProxyMock)
roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher() roomProxyMock.underlyingInfoPublisher = infoSubject.asCurrentValuePublisher()
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -216,10 +213,9 @@ class RoomScreenViewModelTests: XCTestCase {
// Given a room screen with no ongoing call. // Given a room screen with no ongoing call.
let ongoingCallRoomIDSubject = CurrentValueSubject<String?, Never>(nil) let ongoingCallRoomIDSubject = CurrentValueSubject<String?, Never>(nil)
let roomProxyMock = JoinedRoomProxyMock(.init(id: "MyRoomID")) let roomProxyMock = JoinedRoomProxyMock(.init(id: "MyRoomID"))
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: ongoingCallRoomIDSubject.asCurrentValuePublisher(), ongoingCallRoomIDPublisher: ongoingCallRoomIDSubject.asCurrentValuePublisher(),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -262,10 +258,9 @@ class RoomScreenViewModelTests: XCTestCase {
expectation.fulfill() expectation.fulfill()
return .success(()) return .success(())
} }
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -285,10 +280,9 @@ class RoomScreenViewModelTests: XCTestCase {
// This one should be filtered // This one should be filtered
KnockRequestProxyMock(.init(eventID: "2", userID: "@bob:matrix.org", isSeen: true))]), KnockRequestProxyMock(.init(eventID: "2", userID: "@bob:matrix.org", isSeen: true))]),
joinRule: .knock)) joinRule: .knock))
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -321,10 +315,9 @@ class RoomScreenViewModelTests: XCTestCase {
// This one should be filtered // This one should be filtered
KnockRequestProxyMock(.init(eventID: "2", userID: "@bob:matrix.org"))]), KnockRequestProxyMock(.init(eventID: "2", userID: "@bob:matrix.org"))]),
joinRule: .knock)) joinRule: .knock))
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -352,10 +345,9 @@ class RoomScreenViewModelTests: XCTestCase {
ServiceLocator.shared.settings.knockingEnabled = true ServiceLocator.shared.settings.knockingEnabled = true
let roomProxyMock = JoinedRoomProxyMock(.init(knockRequestsState: .loading, let roomProxyMock = JoinedRoomProxyMock(.init(knockRequestsState: .loading,
joinRule: .knock)) joinRule: .knock))
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
@@ -374,10 +366,9 @@ class RoomScreenViewModelTests: XCTestCase {
let roomProxyMock = JoinedRoomProxyMock(.init(knockRequestsState: .loaded([KnockRequestProxyMock(.init(eventID: "1", userID: "@alice:matrix.org", displayName: "Alice", reason: "Hello World!"))]), let roomProxyMock = JoinedRoomProxyMock(.init(knockRequestsState: .loaded([KnockRequestProxyMock(.init(eventID: "1", userID: "@alice:matrix.org", displayName: "Alice", reason: "Hello World!"))]),
joinRule: .knock, joinRule: .knock,
powerLevelsConfiguration: .init(canUserInvite: false))) powerLevelsConfiguration: .init(canUserInvite: false)))
let viewModel = RoomScreenViewModel(clientProxy: ClientProxyMock(), let viewModel = RoomScreenViewModel(userSession: UserSessionMock(.init()),
roomProxy: roomProxyMock, roomProxy: roomProxyMock,
initialSelectedPinnedEventID: nil, initialSelectedPinnedEventID: nil,
mediaProvider: MediaProviderMock(configuration: .init()),
ongoingCallRoomIDPublisher: .init(.init(nil)), ongoingCallRoomIDPublisher: .init(.init(nil)),
appMediator: AppMediatorMock.default, appMediator: AppMediatorMock.default,
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
+16 -24
View File
@@ -304,7 +304,7 @@ class TimelineViewModelTests: XCTestCase {
let viewModel = TimelineViewModel(roomProxy: roomProxy, let viewModel = TimelineViewModel(roomProxy: roomProxy,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -312,8 +312,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
return (viewModel, roomProxy, timelineProxy, timelineController) return (viewModel, roomProxy, timelineProxy, timelineController)
} }
@@ -331,7 +330,7 @@ class TimelineViewModelTests: XCTestCase {
timelineController.timelineItems = [message] timelineController.timelineItems = [message]
let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "", members: [RoomMemberProxyMock.mockAlice, RoomMemberProxyMock.mockCharlie])), let viewModel = TimelineViewModel(roomProxy: JoinedRoomProxyMock(.init(name: "", members: [RoomMemberProxyMock.mockAlice, RoomMemberProxyMock.mockCharlie])),
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -339,8 +338,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
let deferred = deferFulfillment(viewModel.context.$viewState) { value in let deferred = deferFulfillment(viewModel.context.$viewState) { value in
value.bindings.readReceiptsSummaryInfo?.orderedReceipts == receipts value.bindings.readReceiptsSummaryInfo?.orderedReceipts == receipts
@@ -356,7 +354,7 @@ class TimelineViewModelTests: XCTestCase {
RoomMemberProxyMock.mockAlice], RoomMemberProxyMock.mockAlice],
ownUserID: RoomMemberProxyMock.mockAdmin.userID)), ownUserID: RoomMemberProxyMock.mockAdmin.userID)),
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -364,8 +362,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
var deferred = deferFulfillment(viewModel.context.$viewState) { value in var deferred = deferFulfillment(viewModel.context.$viewState) { value in
value.canCurrentUserKick && value.canCurrentUserBan value.canCurrentUserKick && value.canCurrentUserBan
@@ -393,7 +390,7 @@ class TimelineViewModelTests: XCTestCase {
RoomMemberProxyMock.mockAlice], RoomMemberProxyMock.mockAlice],
ownUserID: RoomMemberProxyMock.mockAlice.userID)), ownUserID: RoomMemberProxyMock.mockAlice.userID)),
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -401,8 +398,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
var deferredState = deferFulfillment(viewModel.context.$viewState) { value in var deferredState = deferFulfillment(viewModel.context.$viewState) { value in
!value.canCurrentUserKick && !value.canCurrentUserBan !value.canCurrentUserKick && !value.canCurrentUserBan
@@ -430,7 +426,7 @@ class TimelineViewModelTests: XCTestCase {
RoomMemberProxyMock.mockBanned[0]], RoomMemberProxyMock.mockBanned[0]],
ownUserID: RoomMemberProxyMock.mockAdmin.userID)), ownUserID: RoomMemberProxyMock.mockAdmin.userID)),
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -438,8 +434,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
var deferredState = deferFulfillment(viewModel.context.$viewState) { value in var deferredState = deferFulfillment(viewModel.context.$viewState) { value in
value.canCurrentUserKick && value.canCurrentUserBan value.canCurrentUserKick && value.canCurrentUserBan
@@ -473,7 +468,7 @@ class TimelineViewModelTests: XCTestCase {
let viewModel = TimelineViewModel(roomProxy: roomProxyMock, let viewModel = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -481,8 +476,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
XCTAssertEqual(configuration.pinnedEventIDs, viewModel.context.viewState.pinnedEventIDs) XCTAssertEqual(configuration.pinnedEventIDs, viewModel.context.viewState.pinnedEventIDs)
configuration.pinnedEventIDs = ["test1", "test2"] configuration.pinnedEventIDs = ["test1", "test2"]
@@ -502,7 +496,7 @@ class TimelineViewModelTests: XCTestCase {
let viewModel = TimelineViewModel(roomProxy: roomProxyMock, let viewModel = TimelineViewModel(roomProxy: roomProxyMock,
timelineController: MockTimelineController(), timelineController: MockTimelineController(),
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -510,8 +504,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
var deferred = deferFulfillment(viewModel.context.$viewState) { value in var deferred = deferFulfillment(viewModel.context.$viewState) { value in
value.canCurrentUserPin value.canCurrentUserPin
@@ -541,7 +534,7 @@ class TimelineViewModelTests: XCTestCase {
TimelineViewModel(roomProxy: roomProxy ?? JoinedRoomProxyMock(.init(name: "")), TimelineViewModel(roomProxy: roomProxy ?? JoinedRoomProxyMock(.init(name: "")),
focussedEventID: focussedEventID, focussedEventID: focussedEventID,
timelineController: timelineController, timelineController: timelineController,
mediaProvider: MediaProviderMock(configuration: .init()), userSession: UserSessionMock(.init()),
mediaPlayerProvider: MediaPlayerProviderMock(), mediaPlayerProvider: MediaPlayerProviderMock(),
voiceMessageMediaManager: VoiceMessageMediaManagerMock(), voiceMessageMediaManager: VoiceMessageMediaManagerMock(),
userIndicatorController: userIndicatorControllerMock, userIndicatorController: userIndicatorControllerMock,
@@ -549,8 +542,7 @@ class TimelineViewModelTests: XCTestCase {
appSettings: ServiceLocator.shared.settings, appSettings: ServiceLocator.shared.settings,
analyticsService: ServiceLocator.shared.analytics, analyticsService: ServiceLocator.shared.analytics,
emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings), emojiProvider: EmojiProvider(appSettings: ServiceLocator.shared.settings),
timelineControllerFactory: TimelineControllerFactoryMock(.init()), timelineControllerFactory: TimelineControllerFactoryMock(.init()))
clientProxy: ClientProxyMock(.init()))
} }
} }
@@ -21,8 +21,7 @@ class UserProfileScreenViewModelTests: XCTestCase {
viewModel = UserProfileScreenViewModel(userID: profile.userID, viewModel = UserProfileScreenViewModel(userID: profile.userID,
isPresentedModally: false, isPresentedModally: false,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)
@@ -41,8 +40,7 @@ class UserProfileScreenViewModelTests: XCTestCase {
viewModel = UserProfileScreenViewModel(userID: profile.userID, viewModel = UserProfileScreenViewModel(userID: profile.userID,
isPresentedModally: false, isPresentedModally: false,
clientProxy: clientProxy, userSession: UserSessionMock(.init(clientProxy: clientProxy)),
mediaProvider: MediaProviderMock(configuration: .init()),
userIndicatorController: ServiceLocator.shared.userIndicatorController, userIndicatorController: ServiceLocator.shared.userIndicatorController,
analytics: ServiceLocator.shared.analytics) analytics: ServiceLocator.shared.analytics)