Files
Pulse/Sources/PulseUI/Features/FileViewer/FileViewerViewModel.swift
T
2026-04-19 14:15:46 -04:00

56 lines
1.6 KiB
Swift

// The MIT License (MIT)
//
// Copyright (c) 2020-2026 Alexander Grebenyuk (github.com/kean).
import SwiftUI
import CoreData
import Pulse
import Combine
#if os(iOS) || os(macOS) || os(visionOS)
import PDFKit
#endif
final class FileViewerViewModel: ObservableObject {
let title: String
private let context: FileViewerViewModelContext
var contentType: NetworkLogger.ContentType? { context.contentType }
private let getData: () -> Data
private(set) lazy var contents: Contents = render(data: getData())
init(title: String, context: FileViewerViewModelContext, data: @escaping () -> Data) {
self.title = title
self.context = context
self.getData = data
}
enum Contents {
case image(ImagePreviewViewModel)
case other(RichTextViewModel)
#if os(iOS) || os(macOS) || os(visionOS)
case pdf(PDFDocument)
#endif
}
private func render(data: Data) -> Contents {
if contentType?.isImage ?? false, let image = UXImage(data: data) {
return .image(ImagePreviewViewModel(image: image, data: data, context: context))
} else if contentType?.isPDF ?? false, let pdf = makePDF(data: data) {
return pdf
} else {
let string = TextRenderer().render(data, contentType: contentType, error: context.error)
return .other(RichTextViewModel(string: string, contentType: contentType))
}
}
private func makePDF(data: Data) -> Contents? {
#if os(iOS) || os(macOS) || os(visionOS)
if let pdf = PDFDocument(data: data) {
return .pdf(pdf)
}
#endif
return nil
}
}