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() { if !file.update(id: newId) { newId = file.id } } } extension FileDetailView: MainContentView { init(item: FileResource) { self.init(file: item) } static let itemDescription = "a file" } #Preview { FileDetailView(file: .mock) }