Move media file loading logic to the SDK. (#702)

* Adopt getMediaFile for media previewing.
This commit is contained in:
Doug
2023-03-20 14:51:33 +00:00
committed by GitHub
parent bbd64092e7
commit efdb47a98a
42 changed files with 427 additions and 519 deletions
@@ -17,7 +17,7 @@
import SwiftUI
struct FilePreviewCoordinatorParameters {
let fileURL: URL
let mediaFile: MediaFileHandleProxy
let title: String?
}
@@ -34,7 +34,7 @@ final class FilePreviewCoordinator: CoordinatorProtocol {
init(parameters: FilePreviewCoordinatorParameters) {
self.parameters = parameters
viewModel = FilePreviewViewModel(fileURL: parameters.fileURL, title: parameters.title)
viewModel = FilePreviewViewModel(mediaFile: parameters.mediaFile, title: parameters.title)
}
// MARK: - Public
@@ -21,7 +21,7 @@ enum FilePreviewViewModelAction {
}
struct FilePreviewViewState: BindableState {
let fileURL: URL
let mediaFile: MediaFileHandleProxy
let title: String?
}
@@ -21,8 +21,8 @@ typealias FilePreviewViewModelType = StateStoreViewModel<FilePreviewViewState, F
class FilePreviewViewModel: FilePreviewViewModelType, FilePreviewViewModelProtocol {
var callback: ((FilePreviewViewModelAction) -> Void)?
init(fileURL: URL, title: String? = nil) {
super.init(initialViewState: FilePreviewViewState(fileURL: fileURL, title: title))
init(mediaFile: MediaFileHandleProxy, title: String? = nil) {
super.init(initialViewState: FilePreviewViewState(mediaFile: mediaFile, title: title))
}
override func process(viewAction: FilePreviewViewAction) async {
@@ -24,7 +24,7 @@ struct FilePreviewScreen: View {
var body: some View {
ZStack(alignment: .leading) {
PreviewView(context: context,
fileURL: context.viewState.fileURL,
fileURL: context.viewState.mediaFile.url,
title: context.viewState.title)
.ignoresSafeArea(edges: .bottom)
@@ -93,10 +93,9 @@ private class PreviewItem: NSObject, QLPreviewItem {
// MARK: - Previews
struct FilePreview_Previews: PreviewProvider {
static let viewModel = FilePreviewViewModel(mediaFile: .unmanaged(url: URL(staticString: "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf")))
static var previews: some View {
Group {
let upgradeViewModel = FilePreviewViewModel(fileURL: URL(staticString: "https://www.w3.org/WAI/ER/tests/xhtml/testfiles/resources/pdf/dummy.pdf"))
FilePreviewScreen(context: upgradeViewModel.context)
}
FilePreviewScreen(context: viewModel.context)
}
}
@@ -56,8 +56,8 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
switch action {
case .displayRoomDetails:
self.displayRoomDetails()
case .displayVideo(let fileURL, let title), .displayFile(let fileURL, let title):
self.displayFile(for: fileURL, with: title)
case .displayMediaFile(let file, let title):
self.displayFilePreview(for: file, with: title)
case .displayEmojiPicker(let itemId):
self.displayEmojiPickerScreen(for: itemId)
case .displayReportContent(let itemId):
@@ -77,8 +77,8 @@ final class RoomScreenCoordinator: CoordinatorProtocol {
// MARK: - Private
private func displayFile(for fileURL: URL, with title: String?) {
let params = FilePreviewCoordinatorParameters(fileURL: fileURL, title: title)
private func displayFilePreview(for file: MediaFileHandleProxy, with title: String?) {
let params = FilePreviewCoordinatorParameters(mediaFile: file, title: title)
let coordinator = FilePreviewCoordinator(parameters: params)
coordinator.callback = { [weak self] _ in
self?.navigationStackCoordinator.pop()
@@ -20,8 +20,7 @@ import UIKit
enum RoomScreenViewModelAction {
case displayRoomDetails
case displayVideo(videoURL: URL, title: String?)
case displayFile(fileURL: URL, title: String?)
case displayMediaFile(file: MediaFileHandleProxy, title: String?)
case displayEmojiPicker(itemId: String)
case displayReportContent(itemId: String)
}
@@ -134,10 +134,8 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol
let action = await timelineController.processItemTap(itemId)
switch action {
case .displayVideo(let videoURL, let title):
callback?(.displayVideo(videoURL: videoURL, title: title))
case .displayFile(let fileURL, let title):
callback?(.displayFile(fileURL: fileURL, title: title))
case .displayMediaFile(let file, let title):
callback?(.displayMediaFile(file: file, title: title))
case .none:
break
}
@@ -48,7 +48,7 @@ struct ImageRoomTimelineView: View {
@ViewBuilder
var overlay: some View {
if timelineItem.type == .gif {
if timelineItem.contentType == .gif {
Text(ElementL10n.roomTimelineImageGif)
.font(.element.bodyBold)
.foregroundStyle(.primary)
@@ -96,7 +96,7 @@ struct ImageRoomTimelineView_Previews: PreviewProvider {
source: nil,
aspectRatio: 0.7,
blurhash: "L%KUc%kqS$RP?Ks,WEf8OlrqaekW",
type: .gif))
contentType: .gif))
}
}
}