102 lines
3.4 KiB
Swift
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)
|
|
}
|