diff options
| author | Christian Cleberg <[email protected]> | 2026-03-24 21:48:23 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-03-24 21:48:23 -0500 |
| commit | cf587aa0573ac4f34e1effe70108a9eca82093ac (patch) | |
| tree | 833e6f4961522e35b08af01b5f012983f8e34678 /Rune/Views/Domains/RecordEditView.swift | |
| download | rune-1.0.0.tar.gz rune-1.0.0.tar.bz2 rune-1.0.0.zip | |
v1.0v1.0.0
Diffstat (limited to 'Rune/Views/Domains/RecordEditView.swift')
| -rw-r--r-- | Rune/Views/Domains/RecordEditView.swift | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/Rune/Views/Domains/RecordEditView.swift b/Rune/Views/Domains/RecordEditView.swift new file mode 100644 index 0000000..e0c0fde --- /dev/null +++ b/Rune/Views/Domains/RecordEditView.swift @@ -0,0 +1,105 @@ +import SwiftUI + +struct RecordEditView: View { + let domainName: String + let record: DNSRecord + @ObservedObject var viewModel: DomainViewModel + let client: NjallaClient + + @Environment(\.dismiss) private var dismiss + + @State private var draft: DNSRecordDraft + @State private var showingDeleteConfirmation = false + @State private var localErrorMessage: String? + + init(domainName: String, record: DNSRecord, viewModel: DomainViewModel, client: NjallaClient) { + self.domainName = domainName + self.record = record + self.viewModel = viewModel + self.client = client + _draft = State(initialValue: DNSRecordDraft(record: record)) + } + + var body: some View { + Form { + DNSRecordFormSections(draft: $draft) + + Section { + Button("Save") { + Task { + await save() + } + } + .disabled(viewModel.isSaving || !draft.canSubmit) + } + + Section { + Button("Delete Record", role: .destructive) { + showingDeleteConfirmation = true + } + .foregroundStyle(.red) + } + } + .navigationTitle(record.name) + .navigationBarTitleDisplayMode(.inline) + .onChange(of: draft.type) { oldValue, newValue in + guard oldValue != newValue else { return } + draft.resetTypeSpecificFields() + } + .confirmationDialog( + "Delete \(record.type) record \(record.name)?", + isPresented: $showingDeleteConfirmation, + titleVisibility: .visible + ) { + Button("Delete Record", role: .destructive) { + Task { + await deleteRecord() + } + } + } + .alert("API Error", isPresented: localErrorBinding) { + Button("OK", role: .cancel) {} + } message: { + Text(localErrorMessage ?? "") + } + } + + private func save() async { + do { + try await viewModel.editRecord(for: domainName, recordID: record.id, draft: draft, client: client) + dismiss() + } catch is CancellationError { + return + } catch { + if (error as? URLError)?.code == .cancelled { + return + } + localErrorMessage = error.localizedDescription + } + } + + private func deleteRecord() async { + do { + try await viewModel.removeRecord(record, client: client) + dismiss() + } catch is CancellationError { + return + } catch { + if (error as? URLError)?.code == .cancelled { + return + } + localErrorMessage = error.localizedDescription + } + } + + private var localErrorBinding: Binding<Bool> { + Binding( + get: { localErrorMessage != nil }, + set: { newValue in + if !newValue { + localErrorMessage = nil + } + } + ) + } +} |
