krz/hutch

an ios client for sourcehut

clone: git clone https://gitbay.org/krz/hutch.git

v3.4.0: Hutch/App/HutchApp.swift · raw

 1import SwiftUI
 2import os
 3
 4@main
 5struct HutchApp: App {
 6    private let deepLinkLogger = Logger(subsystem: "net.cleberg.Hutch", category: "DeepLink")
 7    @State private var appState = AppState()
 8    @State private var networkMonitor = NetworkMonitor()
 9    @AppStorage(AppStorageKeys.appTheme, store: .standard) private var appTheme: AppTheme = .system
10    @AppStorage(AppStorageKeys.displayDensity, store: .standard) private var displayDensity: DisplayDensity = .standard
11
12    var body: some Scene {
13        WindowGroup {
14            RootView()
15                .environment(appState)
16                .environment(networkMonitor)
17                .environment(\.displayDensity, displayDensity)
18                .environment(\.isAMOLEDTheme, appTheme == .amoled)
19                .environment(\.defaultMinListRowHeight, displayDensity == .compact ? 36 : 44)
20                .background(appTheme == .amoled ? Color.black : Color.clear)
21                .preferredColorScheme(appTheme.colorScheme)
22                .onOpenURL { url in
23                    deepLinkLogger.info("Received URL: \(url.absoluteString, privacy: .public)")
24                    if let link = DeepLink(url: url) {
25                        deepLinkLogger.info("Parsed deep link: \(String(describing: link), privacy: .public)")
26                        appState.pendingDeepLink = link
27                    } else {
28                        deepLinkLogger.error("Rejected URL: \(url.absoluteString, privacy: .public)")
29                    }
30                }
31                .onChange(of: HutchIntentNavigator.shared.pendingDestination) { _, destination in
32                    guard let destination else { return }
33                    HutchIntentNavigator.shared.pendingDestination = nil
34                    let link: DeepLink
35                    switch destination {
36                    case .home: link = .home
37                    case .work: link = .work
38                    case .builds: link = .buildsTab
39                    case .repositories: link = .repositoriesTab
40                    case .trackers: link = .trackersTab
41                    case .systemStatus: link = .systemStatus
42                    case .lookup: link = .lookup
43                    }
44                    appState.pendingDeepLink = link
45                }
46        }
47    }
48}