summaryrefslogtreecommitdiff
path: root/DomainDig/WatchlistView.swift
diff options
context:
space:
mode:
authorChristian Cleberg <[email protected]>2026-04-20 15:48:47 -0500
committerChristian Cleberg <[email protected]>2026-04-20 15:48:47 -0500
commit397c7c420c22fc1c235893bd85b2029da9145730 (patch)
treed5c12b992c4496eb928f7253252749acb9ac0386 /DomainDig/WatchlistView.swift
parentee2520f2c0c2d806fd284c3d6b8a81a3822f5270 (diff)
downloaddomain-dig-397c7c420c22fc1c235893bd85b2029da9145730.tar.gz
domain-dig-397c7c420c22fc1c235893bd85b2029da9145730.tar.bz2
domain-dig-397c7c420c22fc1c235893bd85b2029da9145730.zip
feat(v1.9.0): add domain availability lookup and watchlist foundation
- implement availability detection (available/registered/unknown) - integrate availability into domain results - add lightweight domain suggestions - introduce local watchlist with persistence - add WatchlistView and toolbar access - include availability in export
Diffstat (limited to 'DomainDig/WatchlistView.swift')
-rw-r--r--DomainDig/WatchlistView.swift69
1 files changed, 69 insertions, 0 deletions
diff --git a/DomainDig/WatchlistView.swift b/DomainDig/WatchlistView.swift
new file mode 100644
index 0000000..c44fc65
--- /dev/null
+++ b/DomainDig/WatchlistView.swift
@@ -0,0 +1,69 @@
+import SwiftUI
+
+struct WatchlistView: View {
+ @Bindable var viewModel: DomainViewModel
+ @Environment(\.dismiss) private var dismiss
+
+ var body: some View {
+ List {
+ if viewModel.watchedDomains.isEmpty {
+ Text("No watched domains")
+ .font(.system(.callout, design: .monospaced))
+ .foregroundStyle(.secondary)
+ .listRowBackground(Color(.systemGray6).opacity(0.5))
+ } else {
+ ForEach(viewModel.watchedDomains) { watchedDomain in
+ Button {
+ viewModel.domain = watchedDomain.domain
+ dismiss()
+ viewModel.run()
+ } label: {
+ VStack(alignment: .leading, spacing: 4) {
+ Text(watchedDomain.domain)
+ .font(.system(.callout, design: .monospaced))
+ .foregroundStyle(.primary)
+ Text(statusLabel(watchedDomain.lastKnownAvailability))
+ .font(.system(.caption2, design: .monospaced))
+ .foregroundStyle(statusColor(watchedDomain.lastKnownAvailability))
+ }
+ }
+ .listRowBackground(Color(.systemGray6).opacity(0.5))
+ }
+ .onDelete { offsets in
+ viewModel.removeWatchedDomains(at: offsets)
+ }
+ }
+ }
+ .scrollContentBackground(.hidden)
+ .background(Color.black)
+ .navigationTitle("Watchlist")
+ .toolbar {
+ if !viewModel.watchedDomains.isEmpty {
+ EditButton()
+ }
+ }
+ .preferredColorScheme(.dark)
+ }
+
+ private func statusLabel(_ status: DomainAvailabilityStatus?) -> String {
+ switch status {
+ case .available:
+ return "Available"
+ case .registered:
+ return "Registered"
+ case .unknown, .none:
+ return "Unknown"
+ }
+ }
+
+ private func statusColor(_ status: DomainAvailabilityStatus?) -> Color {
+ switch status {
+ case .available:
+ return .green
+ case .registered:
+ return .yellow
+ case .unknown, .none:
+ return .secondary
+ }
+ }
+}