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) }