82 lines
2.2 KiB
Swift
82 lines
2.2 KiB
Swift
import SwiftUI
|
|
|
|
struct FileDetailView: View {
|
|
|
|
@ObservedObject
|
|
var file: FileResource
|
|
|
|
@State
|
|
private var newId: String
|
|
|
|
init(file: FileResource) {
|
|
self.file = file
|
|
self.newId = file.id
|
|
}
|
|
|
|
private let allowedCharactersInPostId = CharacterSet.alphanumerics.union(CharacterSet(charactersIn: "-.")).inverted
|
|
|
|
private var idExists: Bool {
|
|
file.content.files.contains { $0.id == newId }
|
|
}
|
|
|
|
private var containsInvalidCharacters: Bool {
|
|
newId.rangeOfCharacter(from: allowedCharactersInPostId) != nil
|
|
}
|
|
|
|
var body: some View {
|
|
VStack(alignment: .leading) {
|
|
Text("File Name")
|
|
.font(.headline)
|
|
HStack {
|
|
TextField("", text: $newId)
|
|
.textFieldStyle(.roundedBorder)
|
|
Button(action: setNewId) {
|
|
Text("Update")
|
|
}
|
|
.disabled(newId.isEmpty || containsInvalidCharacters || idExists)
|
|
}
|
|
Text("German Description")
|
|
.font(.headline)
|
|
TextField("", text: $file.germanDescription)
|
|
.textFieldStyle(.roundedBorder)
|
|
Text("English Description")
|
|
.font(.headline)
|
|
TextField("", text: $file.englishDescription)
|
|
.textFieldStyle(.roundedBorder)
|
|
if file.type.isImage {
|
|
Text("Image size")
|
|
.font(.headline)
|
|
Text("\(Int(file.size.width)) x \(Int(file.size.height)) (\(file.aspectRatio))")
|
|
.foregroundStyle(.secondary)
|
|
#warning("Add button to show image versions")
|
|
}
|
|
Spacer()
|
|
}.padding()
|
|
}
|
|
|
|
private func setNewId() {
|
|
do {
|
|
try file.content.storage.move(file: file.id, to: newId)
|
|
} catch {
|
|
print("Failed to move file \(file.id)")
|
|
newId = file.id
|
|
return
|
|
}
|
|
file.id = newId
|
|
}
|
|
}
|
|
|
|
extension FileDetailView: MainContentView {
|
|
|
|
init(item: FileResource) {
|
|
self.init(file: item)
|
|
}
|
|
|
|
static let itemDescription = "a file"
|
|
}
|
|
|
|
|
|
#Preview {
|
|
FileDetailView(file: .mock)
|
|
}
|