ChWebsiteApp/CHDataManagement/Views/Files/FileContentView.swift
2025-02-17 13:38:48 +01:00

102 lines
3.4 KiB
Swift

import SwiftUI
import SFSafeSymbols
struct FileContentView: View {
private let iconSize: CGFloat = 150
@ObservedObject
var file: FileResource
@State
private var fileContent: String = ""
var body: some View {
VStack {
if file.isExternallyStored {
VStack {
Image(systemSymbol: .squareDashed)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: iconSize)
Text("External file")
.font(.title)
}
.foregroundStyle(.secondary)
} else {
switch file.type.category {
case .image:
(file.imageToDisplay ?? Image(systemSymbol: .exclamationmarkTriangle))
.resizable()
.aspectRatio(contentMode: .fit)
case .model:
VStack {
Image(systemSymbol: .cubeTransparent)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: iconSize)
Text("No preview available")
.font(.title)
}
.foregroundStyle(.secondary)
case .text, .code:
TextFileContentView(file: file)
.id(file.id)
case .video:
VStack {
if let image = file.imageToDisplay {
image
.resizable()
.aspectRatio(contentMode: .fit)
} else {
Image(systemSymbol: .film)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: iconSize)
Button("Generate preview", action: generateVideoPreview)
.font(.body)
}
}.foregroundStyle(.secondary)
case .resource:
VStack {
Image(systemSymbol: .docQuestionmark)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: iconSize)
Text("No preview available")
.font(.title)
}
.foregroundStyle(.secondary)
case .audio:
VStack {
Image(systemSymbol: .waveformPath)
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: iconSize)
Text("No preview available")
.font(.title)
}
.foregroundStyle(.secondary)
}
}
}.padding()
}
private func generateVideoPreview() {
file.createVideoThumbnail()
}
}
extension FileContentView: MainContentView {
init(item: FileResource) {
self.file = item
}
static let itemDescription = "a file"
}
#Preview {
FileContentView(file: .mock)
}