summaryrefslogtreecommitdiff
path: root/DomainDig/DomainViewModel.swift
diff options
context:
space:
mode:
Diffstat (limited to 'DomainDig/DomainViewModel.swift')
-rw-r--r--DomainDig/DomainViewModel.swift165
1 files changed, 2 insertions, 163 deletions
diff --git a/DomainDig/DomainViewModel.swift b/DomainDig/DomainViewModel.swift
index fdf6b84..3814704 100644
--- a/DomainDig/DomainViewModel.swift
+++ b/DomainDig/DomainViewModel.swift
@@ -1100,167 +1100,6 @@ final class DomainViewModel {
await refreshMonitoringAuthorizationStatus()
}
- func refreshMonitoringAuthorizationStatus() async {
- let settings = await UNUserNotificationCenter.current().notificationSettings()
- monitoringNotificationStatus = settings.authorizationStatus
- }
-
- func setMonitoringEnabled(_ isEnabled: Bool) {
- guard !isEnabled || FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- monitoringSettings.isEnabled = false
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
-
- monitoringSettings.isEnabled = isEnabled
- persistMonitoringSettings(localActivationConfirmed: isEnabled)
- monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
- }
-
- func setMonitoringScope(_ scope: MonitoringScope) {
- monitoringSettings.scope = scope
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- }
-
- func setMonitoringBaseInterval(_ baseInterval: MonitoringBaseInterval) {
- guard FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
- monitoringSettings.baseInterval = baseInterval.interval
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
- }
-
- func setMonitoringAdaptiveEnabled(_ isEnabled: Bool) {
- guard FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
- monitoringSettings.adaptiveEnabled = isEnabled
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
- }
-
- func setMonitoringSensitivity(_ sensitivity: MonitoringSensitivity) {
- guard FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
- monitoringSettings.sensitivity = sensitivity
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
- }
-
- func setMonitoringQuietHours(startHour: Int, endHour: Int, isEnabled: Bool) {
- guard FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
- monitoringSettings.quietHours = isEnabled ? QuietHours(startHour: startHour, endHour: endHour) : nil
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- }
-
- func setMonitoringAlertFilter(_ filter: MonitoringAlertFilter) {
- guard FeatureAccessService.hasAccess(to: .localAlerts) else {
- monitoringSettings.alertsEnabled = false
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .localAlerts)
- return
- }
- monitoringSettings.alertFilter = filter
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- }
-
- func setMonitoringAlertsEnabled(_ isEnabled: Bool) {
- guard !isEnabled || FeatureAccessService.hasAccess(to: .localAlerts) else {
- monitoringSettings.alertsEnabled = false
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .localAlerts)
- return
- }
- monitoringSettings.alertsEnabled = isEnabled
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- }
-
- func setMonitoringSelection(for trackedDomain: TrackedDomain, isSelected: Bool) {
- if isSelected {
- if !monitoringSettings.selectedDomainIDs.contains(trackedDomain.id) {
- monitoringSettings.selectedDomainIDs.append(trackedDomain.id)
- }
- } else {
- monitoringSettings.selectedDomainIDs.removeAll { $0 == trackedDomain.id }
- }
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- }
-
- func toggleMonitoring(for trackedDomain: TrackedDomain) {
- guard canEdit(trackedDomain) else { return }
- guard FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
- guard let index = trackedDomains.firstIndex(where: { $0.id == trackedDomain.id }) else { return }
- trackedDomains[index].monitoringEnabled.toggle()
- trackedDomains[index].updatedAt = Date()
- MonitoringStorage.saveTrackedDomains(trackedDomains)
- CloudSyncService.shared.scheduleSyncIfNeeded()
- sanitizeMonitoringSelection()
- }
-
- func requestMonitoringNotificationAuthorization() async {
- let granted = await LocalNotificationService.shared.requestAuthorizationIfNeeded()
- monitoringSettings.alertsEnabled = granted
- persistMonitoringSettings(localActivationConfirmed: monitoringSettings.isEnabled)
- await refreshMonitoringAuthorizationStatus()
- }
-
- func runMonitoringNow() {
- guard FeatureAccessService.hasAccess(to: .automatedMonitoring) else {
- upgradePrompt = FeatureAccessService.upgradePrompt(for: .automatedMonitoring)
- return
- }
- guard !monitoringRunInProgress else { return }
-
- monitoringRunInProgress = true
- monitoringStatusMessage = nil
-
- Task { [weak self] in
- guard let self else { return }
- let outcome = await DomainMonitoringService.shared.performMonitoring(
- trigger: .manual,
- requireEnabledSetting: false
- )
- await MainActor.run {
- self.refreshMonitoringState()
- self.monitoringRunInProgress = false
- self.monitoringStatusMessage = outcome.message
- }
- }
- }
-
- func monitoringIntervalLabel(for trackedDomain: TrackedDomain) -> String {
- let state = DomainMonitoringScheduler.normalizedMonitoringState(for: trackedDomain, settings: monitoringSettings)
- return Self.intervalLabel(for: state.currentInterval)
- }
-
- func monitoringStatusLabel(for trackedDomain: TrackedDomain) -> String {
- let state = trackedDomain.monitoringState
- if let lastChangeDate = state.lastChangeDate,
- Date().timeIntervalSince(lastChangeDate) <= 6 * 60 * 60 {
- return "Recently Changed"
- }
- if state.consecutiveStableChecks >= 2 {
- return "Stable"
- }
- return trackedDomain.monitoringEnabled ? "Active" : "Paused"
- }
-
- private static func intervalLabel(for interval: TimeInterval) -> String {
- let formatter = DateComponentsFormatter()
- formatter.allowedUnits = interval < 3600 ? [.minute] : [.hour, .minute]
- formatter.unitsStyle = .full
- return formatter.string(from: interval) ?? "Unknown"
- }
-
func rerunLookup(from entry: HistoryEntry, useSnapshotResolver: Bool) {
if useSnapshotResolver {
UserDefaults.standard.set(entry.resolverURLString, forKey: DNSResolverOption.userDefaultsKey)
@@ -2590,13 +2429,13 @@ final class DomainViewModel {
return existingMax + 1
}
- private func persistMonitoringSettings(localActivationConfirmed: Bool = false) {
+ func persistMonitoringSettings(localActivationConfirmed: Bool = false) {
monitoringSettings = MonitoringStorage.sanitizeSettings(monitoringSettings, trackedDomains: trackedDomains)
MonitoringStorage.saveSettings(monitoringSettings)
CloudSyncService.shared.markMonitoringSettingsChanged(localActivationConfirmed: localActivationConfirmed)
}
- private func sanitizeMonitoringSelection() {
+ func sanitizeMonitoringSelection() {
monitoringSettings = MonitoringStorage.sanitizeSettings(monitoringSettings, trackedDomains: trackedDomains)
MonitoringStorage.saveSettings(monitoringSettings)
CloudSyncService.shared.markMonitoringSettingsChanged(localActivationConfirmed: false)