mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-04 10:33:45 +00:00
Move media file loading logic to the SDK. (#702)
* Adopt getMediaFile for media previewing.
This commit is contained in:
@@ -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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user