Room details screen (#348)

* Create screen module

* Display details on header tap

* Add strings

* Add room avatar size on details

* Update members method signature

* Use room proxy values

* Create room members screen

* Display room members on tap

* Update previews and mock room proxy

* Commit project file

* Various tweaks and cleanup following code review

* More small tweaks + UI and screenshot tests

Co-authored-by: Stefan Ceriu <stefanc@matrix.org>
This commit is contained in:
ismailgulek
2022-12-19 15:39:33 +03:00
committed by GitHub
parent 4b29318147
commit 1a47fd1a8d
43 changed files with 1192 additions and 33 deletions
@@ -18,10 +18,9 @@ import SwiftUI
struct RoomScreenCoordinatorParameters {
let navigationStackCoordinator: NavigationStackCoordinator
let roomProxy: RoomProxyProtocol
let timelineController: RoomTimelineControllerProtocol
let mediaProvider: MediaProviderProtocol
let roomName: String?
let roomAvatarUrl: String?
let emojiProvider: EmojiProviderProtocol
}
@@ -43,8 +42,8 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
viewModel = RoomScreenViewModel(timelineController: parameters.timelineController,
timelineViewFactory: RoomTimelineViewFactory(),
mediaProvider: parameters.mediaProvider,
roomName: parameters.roomName,
roomAvatarUrl: parameters.roomAvatarUrl)
roomName: parameters.roomProxy.displayName ?? parameters.roomProxy.name,
roomAvatarUrl: parameters.roomProxy.avatarURL)
}
// MARK: - Public
@@ -54,6 +53,8 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
guard let self else { return }
MXLog.debug("RoomScreenViewModel did complete with result: \(result).")
switch result {
case .displayRoomDetails:
self.displayRoomDetails()
case .displayVideo(let videoURL):
self.displayVideo(for: videoURL)
case .displayFile(let fileURL, let title):
@@ -122,4 +123,21 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
navigationStackCoordinator.setSheetCoordinator(coordinator)
}
private func displayRoomDetails() {
guard let roomProxy = parameters?.roomProxy,
let mediaProvider = parameters?.mediaProvider else {
return
}
let params = RoomDetailsCoordinatorParameters(navigationStackCoordinator: navigationStackCoordinator,
roomProxy: roomProxy,
mediaProvider: mediaProvider)
let coordinator = RoomDetailsCoordinator(parameters: params)
coordinator.callback = { [weak self] _ in
self?.navigationStackCoordinator.pop()
}
navigationStackCoordinator.push(coordinator)
}
}
@@ -18,6 +18,7 @@ import Combine
import UIKit
enum RoomScreenViewModelAction {
case displayRoomDetails
case displayVideo(videoURL: URL)
case displayFile(fileURL: URL, title: String?)
case displayEmojiPicker(itemId: String)
@@ -30,6 +31,7 @@ enum RoomScreenComposerMode: Equatable {
}
enum RoomScreenViewAction {
case headerTapped
case displayEmojiPicker(itemId: String)
case emojiTapped(emoji: String, itemId: String)
case paginateBackwards
@@ -98,6 +98,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
// swiftlint:disable:next cyclomatic_complexity
override func process(viewAction: RoomScreenViewAction) async {
switch viewAction {
case .headerTapped:
callback?(.displayRoomDetails)
case .paginateBackwards:
await paginateBackwards()
case .itemAppeared(let id):
@@ -24,12 +24,16 @@ struct RoomHeaderView: View {
@ObservedObject var context: RoomScreenViewModel.Context
var body: some View {
HStack(spacing: 8) {
roomAvatar
.accessibilityHidden(true)
Text(context.viewState.roomTitle)
.font(.element.headline)
.accessibilityIdentifier("roomNameLabel")
Button {
context.send(viewAction: .headerTapped)
} label: {
HStack(spacing: 8) {
roomAvatar
.accessibilityHidden(true)
Text(context.viewState.roomTitle)
.font(.element.headline)
.accessibilityIdentifier("roomNameLabel")
}
}
}