2026-04-14 18:20:30 +02:00
|
|
|
//
|
|
|
|
|
// ViewModel.swift
|
|
|
|
|
// dns
|
|
|
|
|
//
|
|
|
|
|
// Created by Benjamin Erhart on 14.04.26.
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
import Foundation
|
|
|
|
|
import Combine
|
2026-04-14 18:57:37 +02:00
|
|
|
import NetworkExtension
|
|
|
|
|
import OSLog
|
2026-04-14 18:20:30 +02:00
|
|
|
|
|
|
|
|
class ViewModel: NSObject, ObservableObject {
|
|
|
|
|
|
2026-05-29 15:41:27 +02:00
|
|
|
static let title = "SR2® Cloud DNS"
|
|
|
|
|
|
2026-04-15 14:13:47 +02:00
|
|
|
// MARK: Public Properties
|
|
|
|
|
|
2026-04-14 18:20:30 +02:00
|
|
|
@Published
|
2026-04-15 13:40:29 +02:00
|
|
|
var blocklist: BlocklistOption = .secure {
|
|
|
|
|
didSet {
|
2026-05-29 15:48:16 +02:00
|
|
|
Task {
|
|
|
|
|
manager.dnsSettings = blocklist.settings
|
|
|
|
|
manager.localizedDescription = blocklist.title
|
2026-04-15 13:40:29 +02:00
|
|
|
|
2026-05-29 15:48:16 +02:00
|
|
|
do {
|
|
|
|
|
try await manager.saveToPreferences()
|
|
|
|
|
}
|
|
|
|
|
catch {
|
|
|
|
|
log.error("Error storing preferences: \(error)")
|
|
|
|
|
}
|
2026-04-15 13:47:36 +02:00
|
|
|
}
|
2026-04-15 13:40:29 +02:00
|
|
|
}
|
|
|
|
|
}
|
2026-04-14 18:20:30 +02:00
|
|
|
|
2026-04-14 18:57:37 +02:00
|
|
|
@Published
|
2026-05-29 15:41:27 +02:00
|
|
|
var isDnsEnabled = false
|
2026-04-14 18:57:37 +02:00
|
|
|
|
2026-04-15 14:13:47 +02:00
|
|
|
@Published
|
|
|
|
|
var summaryStatus: SummaryStatus = .pending
|
2026-04-14 18:57:37 +02:00
|
|
|
|
|
|
|
|
|
2026-04-15 14:13:47 +02:00
|
|
|
// MARK: Private Properties
|
|
|
|
|
|
2026-04-14 18:57:37 +02:00
|
|
|
private let manager = NEDNSSettingsManager.shared()
|
|
|
|
|
|
|
|
|
|
private let log = Logger(subsystem: String(describing: ViewModel.self), category: String(describing: ViewModel.self))
|
|
|
|
|
|
|
|
|
|
|
2026-04-15 13:41:38 +02:00
|
|
|
override init() {
|
|
|
|
|
super.init()
|
|
|
|
|
|
2026-05-29 15:41:27 +02:00
|
|
|
isDnsEnabled = manager.isEnabled
|
|
|
|
|
|
2026-04-15 13:41:38 +02:00
|
|
|
Task {
|
|
|
|
|
do {
|
|
|
|
|
try await manager.loadFromPreferences()
|
|
|
|
|
}
|
|
|
|
|
catch {
|
|
|
|
|
log.error("Error loading preferences: \(error)")
|
|
|
|
|
}
|
|
|
|
|
|
2026-05-29 15:41:27 +02:00
|
|
|
if let settings = manager.dnsSettings {
|
2026-04-15 13:41:38 +02:00
|
|
|
for dnsServer in BlocklistOption.allCases {
|
|
|
|
|
if settings.servers.contains(dnsServer.ipv4) {
|
|
|
|
|
await MainActor.run {
|
|
|
|
|
blocklist = dnsServer
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
break
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-05-29 15:52:26 +02:00
|
|
|
else {
|
|
|
|
|
// Trigger `blocklist.didSet` to store right away, so user has something to select.
|
|
|
|
|
blocklist = blocklist
|
|
|
|
|
}
|
2026-04-15 13:41:38 +02:00
|
|
|
}
|
2026-04-15 14:13:47 +02:00
|
|
|
|
|
|
|
|
Task {
|
|
|
|
|
await fetchServerStatus()
|
|
|
|
|
}
|
2026-04-15 13:41:38 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2026-04-15 14:13:47 +02:00
|
|
|
// MARK: Public Methods
|
|
|
|
|
|
|
|
|
|
func fetchServerStatus() async {
|
|
|
|
|
do {
|
|
|
|
|
let (data, _) = try await URLSession.shared.data(for: .init(url: .init(string: "https://status.sr2.uk/index.json")!))
|
|
|
|
|
|
|
|
|
|
let status = try JSONDecoder().decode(Status.self, from: data)
|
|
|
|
|
|
|
|
|
|
summaryStatus = status.summaryStatus
|
|
|
|
|
}
|
|
|
|
|
catch {
|
|
|
|
|
log.error("Error while checking status: \(error)")
|
|
|
|
|
}
|
|
|
|
|
}
|
2026-04-14 18:20:30 +02:00
|
|
|
}
|