Add a UserProfileScreen for profiles of non-members. (#2687)

This commit is contained in:
Doug
2024-04-12 09:54:14 +01:00
committed by GitHub
parent 47912d999b
commit 5c9d0975ce
22 changed files with 520 additions and 56 deletions
@@ -185,6 +185,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
return .roomMemberDetails(userID: userID, fromRoomMembersList: true)
case (.roomMemberDetails(_, let fromRoomMembersList), .dismissRoomMemberDetails):
return fromRoomMembersList ? .roomMembersList : .room
case (.roomMemberDetails(_, fromRoomMembersList: false), .presentUserProfile(let userID)):
return .userProfile(userID: userID)
case (.userProfile, .dismissUserProfile):
return .room
case (.roomDetails, .presentInviteUsersScreen):
return .inviteUsersScreen(fromRoomMembersList: false)
@@ -304,6 +309,11 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
presentRoomMemberDetails(userID: userID)
case (.roomMemberDetails, .dismissRoomMemberDetails, .roomMembersList):
break
case (.roomMemberDetails, .presentUserProfile(let userID), .userProfile):
replaceRoomMemberDetailsWithUserProfile(userID: userID)
case (.userProfile, .dismissUserProfile, .room):
break
case (.roomDetails, .presentInviteUsersScreen, .inviteUsersScreen):
presentInviteUsersScreen()
@@ -874,35 +884,10 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
coordinator.actions.sink { [weak self] action in
guard let self else { return }
switch action {
case .openUserProfile:
stateMachine.tryEvent(.presentUserProfile(userID: userID))
case .openDirectChat(let displayName):
let loadingIndicatorIdentifier = "OpenDirectChatLoadingIndicator"
userIndicatorController.submitIndicator(UserIndicator(id: loadingIndicatorIdentifier,
type: .modal(progress: .indeterminate, interactiveDismissDisabled: true, allowsInteraction: false),
title: L10n.commonLoading,
persistent: true))
Task { [weak self] in
guard let self else { return }
let currentDirectRoom = await userSession.clientProxy.directRoomForUserID(userID)
switch currentDirectRoom {
case .success(.some(let roomID)):
stateMachine.tryEvent(.presentChildRoom(roomID: roomID))
case .success(nil):
switch await userSession.clientProxy.createDirectRoom(with: userID, expectedRoomName: displayName) {
case .success(let roomID):
analytics.trackCreatedRoom(isDM: true)
stateMachine.tryEvent(.presentChildRoom(roomID: roomID))
case .failure:
userIndicatorController.alertInfo = .init(id: UUID())
}
case .failure:
userIndicatorController.alertInfo = .init(id: UUID())
}
userIndicatorController.retractIndicatorWithId(loadingIndicatorIdentifier)
}
openDirectChat(with: userID, displayName: displayName)
}
}
.store(in: &cancellables)
@@ -912,6 +897,60 @@ class RoomFlowCoordinator: FlowCoordinatorProtocol {
}
}
private func replaceRoomMemberDetailsWithUserProfile(userID: String) {
let parameters = UserProfileScreenCoordinatorParameters(userID: userID,
clientProxy: userSession.clientProxy,
mediaProvider: userSession.mediaProvider,
userIndicatorController: userIndicatorController)
let coordinator = UserProfileScreenCoordinator(parameters: parameters)
coordinator.actionsPublisher.sink { [weak self] action in
guard let self else { return }
switch action {
case .openDirectChat(let displayName):
openDirectChat(with: userID, displayName: displayName)
}
}
.store(in: &cancellables)
// Replace the RoomMemberDetailsScreen without any animation.
navigationStackCoordinator.pop(animated: false)
navigationStackCoordinator.push(coordinator, animated: false) { [weak self] in
self?.stateMachine.tryEvent(.dismissUserProfile)
}
}
private func openDirectChat(with userID: String, displayName: String?) {
let loadingIndicatorIdentifier = "OpenDirectChatLoadingIndicator"
userIndicatorController.submitIndicator(UserIndicator(id: loadingIndicatorIdentifier,
type: .modal(progress: .indeterminate, interactiveDismissDisabled: true, allowsInteraction: false),
title: L10n.commonLoading,
persistent: true))
Task { [weak self] in
guard let self else { return }
let currentDirectRoom = await userSession.clientProxy.directRoomForUserID(userID)
switch currentDirectRoom {
case .success(.some(let roomID)):
stateMachine.tryEvent(.presentChildRoom(roomID: roomID))
case .success(nil):
switch await userSession.clientProxy.createDirectRoom(with: userID, expectedRoomName: displayName) {
case .success(let roomID):
analytics.trackCreatedRoom(isDM: true)
stateMachine.tryEvent(.presentChildRoom(roomID: roomID))
case .failure:
userIndicatorController.alertInfo = .init(id: UUID())
}
case .failure:
userIndicatorController.alertInfo = .init(id: UUID())
}
userIndicatorController.retractIndicatorWithId(loadingIndicatorIdentifier)
}
}
private func presentMessageForwarding(for itemID: TimelineItemIdentifier) {
guard let roomSummaryProvider = userSession.clientProxy.alternateRoomSummaryProvider, let eventID = itemID.eventID else {
fatalError()
@@ -1160,6 +1199,7 @@ private extension RoomFlowCoordinator {
case globalNotificationSettings
case roomMembersList
case roomMemberDetails(userID: String, fromRoomMembersList: Bool)
case userProfile(userID: String)
case inviteUsersScreen(fromRoomMembersList: Bool)
case mediaUploadPicker(source: MediaPickerScreenSource)
case mediaUploadPreview(fileURL: URL)
@@ -1207,6 +1247,9 @@ private extension RoomFlowCoordinator {
case presentRoomMemberDetails(userID: String)
case dismissRoomMemberDetails
case presentUserProfile(userID: String)
case dismissUserProfile
case presentInviteUsersScreen
case dismissInviteUsersScreen