diff options
| author | Christian Cleberg <[email protected]> | 2026-04-11 11:48:40 -0500 |
|---|---|---|
| committer | Christian Cleberg <[email protected]> | 2026-04-11 11:48:40 -0500 |
| commit | fcf864a15b70e4ecb5bd789b1db3116221c34394 (patch) | |
| tree | f15315324b9f95286b6bf7392dd0ccaee210c2de /Rune/Views/Domains/RecordEditView.swift | |
| parent | cf587aa0573ac4f34e1effe70108a9eca82093ac (diff) | |
| download | rune-fcf864a15b70e4ecb5bd789b1db3116221c34394.tar.gz rune-fcf864a15b70e4ecb5bd789b1db3116221c34394.tar.bz2 rune-fcf864a15b70e4ecb5bd789b1db3116221c34394.zip | |
add FUNDING.yml
Diffstat (limited to 'Rune/Views/Domains/RecordEditView.swift')
| -rw-r--r-- | Rune/Views/Domains/RecordEditView.swift | 51 |
1 files changed, 32 insertions, 19 deletions
diff --git a/Rune/Views/Domains/RecordEditView.swift b/Rune/Views/Domains/RecordEditView.swift index e0c0fde..fceaaba 100644 --- a/Rune/Views/Domains/RecordEditView.swift +++ b/Rune/Views/Domains/RecordEditView.swift @@ -10,7 +10,6 @@ struct RecordEditView: View { @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 @@ -35,71 +34,85 @@ struct RecordEditView: View { Section { Button("Delete Record", role: .destructive) { + guard !viewModel.isSaving else { return } showingDeleteConfirmation = true } .foregroundStyle(.red) + .disabled(viewModel.isSaving) } } .navigationTitle(record.name) .navigationBarTitleDisplayMode(.inline) + .overlay { + if viewModel.isSaving { + ProgressView() + .controlSize(.large) + } + } + .interactiveDismissDisabled(viewModel.isSaving) .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 - ) { + .alert(deleteAlertTitle, isPresented: $showingDeleteConfirmation) { Button("Delete Record", role: .destructive) { Task { await deleteRecord() } } + Button("Cancel", role: .cancel) {} + } message: { + Text("This action cannot be undone.") } - .alert("API Error", isPresented: localErrorBinding) { + .alert("Request Failed", isPresented: mutationErrorBinding) { Button("OK", role: .cancel) {} } message: { - Text(localErrorMessage ?? "") + Text(viewModel.mutationErrorMessage ?? "") } } private func save() async { + guard !viewModel.isSaving else { + return + } + 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 + return } } private func deleteRecord() async { + guard !viewModel.isSaving else { + return + } + do { try await viewModel.removeRecord(record, client: client) dismiss() } catch is CancellationError { return } catch { - if (error as? URLError)?.code == .cancelled { - return - } - localErrorMessage = error.localizedDescription + return } } - private var localErrorBinding: Binding<Bool> { + private var mutationErrorBinding: Binding<Bool> { Binding( - get: { localErrorMessage != nil }, + get: { viewModel.mutationErrorMessage != nil }, set: { newValue in if !newValue { - localErrorMessage = nil + viewModel.dismissMutationError() } } ) } + + private var deleteAlertTitle: String { + "Delete \(record.type) record \(record.name)?" + } } |
