krz/domain-dig

an ios app for DNS & SSL analysis

clone: git clone https://gitbay.org/krz/domain-dig.git

v4.8.1: DomainDig/DomainDigApp.swift · raw

 1//
 2//  DomainDigApp.swift
 3//  DomainDig
 4//
 5//  Created by cmc on 2026-03-10.
 6//
 7
 8import SwiftUI
 9
10@main
11struct DomainDigApp: App {
12    @UIApplicationDelegateAdaptor(DomainDigAppDelegate.self) private var appDelegate
13    @Environment(\.scenePhase) private var scenePhase
14    @AppStorage(AppDensity.userDefaultsKey) private var density = AppDensity.compact.rawValue
15    @State private var viewModel = DomainViewModel()
16    @State private var purchaseService = PurchaseService.shared
17    @State private var cloudSyncService = CloudSyncService.shared
18    @State private var localAPIService = LocalAPIService.shared
19
20    init() {
21        LocalNotificationService.shared.configureForegroundPresentation()
22        DomainMonitoringScheduler.shared.registerBackgroundTask()
23        ScheduledReportScheduler.shared.registerBackgroundTask()
24    }
25
26    var body: some Scene {
27        WindowGroup {
28            RootTabView(viewModel: viewModel)
29                .environment(\.appDensity, AppDensity(rawValue: density) ?? .compact)
30                .task {
31                    let _ = purchaseService.currentTier
32                    let _ = cloudSyncService.status
33                    let _ = localAPIService.isRunning
34                    let _ = IntegrationService.shared.targets.count
35                    await purchaseService.refreshEntitlements()
36                    viewModel.refreshMonitoringState()
37                    await viewModel.refreshMonitoringAuthorizationStatus()
38                    await cloudSyncService.refreshAvailability()
39                    localAPIService.refresh()
40                    cloudSyncService.scheduleSyncIfNeeded(trigger: .launch)
41                    viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
42                    ScheduledReportScheduler.shared.syncSchedule()
43                    IntegrationService.shared.processQueueNow()
44                    viewModel.refreshWidgetData()
45                    consumeShareInbox()
46                }
47                .onReceive(NotificationCenter.default.publisher(for: .cloudSyncDidApplyChanges)) { _ in
48                    viewModel.refreshPersistedData()
49                    viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
50                    IntegrationService.shared.refresh()
51                }
52        }
53        .onChange(of: scenePhase) { _, newValue in
54            guard newValue == .active else { return }
55            viewModel.refreshMonitoringState()
56            Task {
57                await viewModel.refreshMonitoringAuthorizationStatus()
58                await cloudSyncService.refreshAvailability()
59            }
60            localAPIService.refresh()
61            cloudSyncService.scheduleSyncIfNeeded(trigger: .launch)
62            viewModel.monitoringStatusMessage = DomainMonitoringScheduler.shared.syncSchedule()
63            ScheduledReportScheduler.shared.syncSchedule()
64            IntegrationService.shared.processQueueNow()
65            viewModel.refreshWidgetData()
66            consumeShareInbox()
67        }
68    }
69
70    /// Picks up a domain shared via the share extension and routes it into an
71    /// inspection through the intent router (consumed by `RootTabView`).
72    private func consumeShareInbox() {
73        guard let domain = DomainDigShareInbox.consume() else { return }
74        DomainDigIntentRouter.shared.pendingAction = .inspect(domain)
75    }
76}