import SwiftUI struct AddBookmarkView: View { @Bindable var viewModel: BookmarksViewModel @Environment(\.dismiss) private var dismiss @State private var url = "" @State private var title = "" @State private var tagsText = "" @State private var isSaving = false @State private var error: String? var body: some View { NavigationStack { Form { Section { TextField("https://", text: $url) .keyboardType(.URL) .textInputAutocapitalization(.never) .autocorrectionDisabled() } header: { Text("URL") } Section { TextField("Optional", text: $title) } header: { Text("Title") } Section { TextField("comma separated", text: $tagsText) .textInputAutocapitalization(.never) .autocorrectionDisabled() } header: { Text("Tags") } footer: { Text("Separate tags with commas") } if let error { Section { Text(error) .foregroundStyle(.red) .font(.footnote) } } } .navigationTitle("Add Bookmark") .navigationBarTitleDisplayMode(.inline) .toolbar { ToolbarItem(placement: .cancellationAction) { Button("Cancel") { dismiss() } } ToolbarItem(placement: .confirmationAction) { Button("Save") { save() } .disabled(url.trimmingCharacters(in: .whitespaces).isEmpty || isSaving) .overlay { if isSaving { ProgressView().scaleEffect(0.7) } } } } } } private func save() { var urlString = url.trimmingCharacters(in: .whitespaces) if !urlString.hasPrefix("http://") && !urlString.hasPrefix("https://") { urlString = "https://" + urlString } guard URL(string: urlString) != nil else { error = "Invalid URL" return } let tags = tagsText.split(separator: ",").map { $0.trimmingCharacters(in: .whitespaces) }.filter { !$0.isEmpty } isSaving = true error = nil Task { do { try await viewModel.addBookmark(url: urlString, title: title.trimmingCharacters(in: .whitespaces), tags: tags) dismiss() } catch { self.error = error.localizedDescription isSaving = false } } } }