summaryrefslogtreecommitdiff
path: root/Rune/Views/Domains/DomainEditView.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-03-24 21:48:23 -0500
committerChristian Cleberg <[email protected]>2026-03-24 21:48:23 -0500
commitcf587aa0573ac4f34e1effe70108a9eca82093ac (patch)
tree833e6f4961522e35b08af01b5f012983f8e34678 /Rune/Views/Domains/DomainEditView.swift
downloadrune-cf587aa0573ac4f34e1effe70108a9eca82093ac.tar.gz
rune-cf587aa0573ac4f34e1effe70108a9eca82093ac.tar.bz2
rune-cf587aa0573ac4f34e1effe70108a9eca82093ac.zip
v1.0v1.0.0
Diffstat (limited to 'Rune/Views/Domains/DomainEditView.swift')
-rw-r--r--Rune/Views/Domains/DomainEditView.swift99
1 files changed, 99 insertions, 0 deletions
diff --git a/Rune/Views/Domains/DomainEditView.swift b/Rune/Views/Domains/DomainEditView.swift
new file mode 100644
index 0000000..3f197e3
--- /dev/null
+++ b/Rune/Views/Domains/DomainEditView.swift
@@ -0,0 +1,99 @@
+import SwiftUI
+
+struct DomainEditView: View {
+ let domain: Domain
+ @ObservedObject var viewModel: DomainViewModel
+ let client: NjallaClient
+
+ @Environment(\.dismiss) private var dismiss
+
+ @State private var autorenew: Bool
+ @State private var mailforwarding: Bool
+ @State private var dnssec: Bool
+ @State private var lock: Bool
+ @State private var nameserversText: String
+ @State private var localErrorMessage: String?
+
+ init(domain: Domain, viewModel: DomainViewModel, client: NjallaClient) {
+ self.domain = domain
+ self.viewModel = viewModel
+ self.client = client
+ _autorenew = State(initialValue: domain.autorenew ?? false)
+ _mailforwarding = State(initialValue: domain.mailforwarding ?? false)
+ _dnssec = State(initialValue: domain.dnssec ?? false)
+ _lock = State(initialValue: domain.lock ?? false)
+ _nameserversText = State(initialValue: (domain.nameservers ?? []).joined(separator: "\n"))
+ }
+
+ var body: some View {
+ Form {
+ Section("Settings") {
+ Toggle("Autorenew", isOn: $autorenew)
+ Toggle("Mail Forwarding", isOn: $mailforwarding)
+ Toggle("DNSSEC", isOn: $dnssec)
+ Toggle("Registrar Lock", isOn: $lock)
+ }
+
+ Section {
+ TextEditor(text: $nameserversText)
+ .frame(minHeight: 120)
+ } header: {
+ Text("Nameservers")
+ } footer: {
+ Text("Enter one nameserver per line. Leave blank to use Njalla defaults.")
+ }
+
+ Section {
+ Button("Save") {
+ Task {
+ await save()
+ }
+ }
+ .disabled(viewModel.isSaving)
+ }
+ }
+ .navigationTitle("Edit Domain")
+ .navigationBarTitleDisplayMode(.inline)
+ .alert("API Error", isPresented: localErrorBinding) {
+ Button("OK", role: .cancel) {}
+ } message: {
+ Text(localErrorMessage ?? "")
+ }
+ }
+
+ private func save() async {
+ let request = DomainUpdateRequest(
+ autorenew: autorenew,
+ mailforwarding: mailforwarding,
+ dnssec: dnssec,
+ lock: lock,
+ nameservers: nameserversText
+ .split(whereSeparator: \.isNewline)
+ .map { $0.trimmingCharacters(in: .whitespacesAndNewlines) }
+ .filter { !$0.isEmpty }
+ )
+
+ do {
+ try await viewModel.updateDomain(named: domain.name, request: request, 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
+ }
+ }
+ )
+ }
+}