87 lines
2.4 KiB
Swift
87 lines
2.4 KiB
Swift
import Models
|
|
import OSLog
|
|
import Services
|
|
import SwiftUI
|
|
import Utils
|
|
import Views
|
|
|
|
let appLogger = Logger(subsystem: "app.omnivore", category: "app-package")
|
|
|
|
@MainActor
|
|
public struct RootView: View {
|
|
@Environment(\.scenePhase) var scenePhase
|
|
@StateObject private var viewModel = RootViewModel()
|
|
|
|
public init(intercomProvider: IntercomProvider?) {
|
|
if let intercomProvider = intercomProvider {
|
|
DataService.showIntercomMessenger = intercomProvider.showIntercomMessenger
|
|
DataService.registerIntercomUser = intercomProvider.registerIntercomUser
|
|
Authenticator.unregisterIntercomUser = intercomProvider.unregisterIntercomUser
|
|
}
|
|
|
|
#if os(iOS)
|
|
PDFReaderViewController.registerKey()
|
|
#endif
|
|
}
|
|
|
|
public var body: some View {
|
|
InnerRootView(viewModel: viewModel)
|
|
.environmentObject(viewModel.services.authenticator)
|
|
.environmentObject(viewModel.services.dataService)
|
|
.environmentObject(viewModel.services.audioController)
|
|
.environment(\.managedObjectContext, viewModel.services.dataService.viewContext)
|
|
.onChange(of: scenePhase) { phase in
|
|
if phase == .background {
|
|
#if os(iOS)
|
|
Services.scheduleBackgroundFetch()
|
|
#endif
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
@MainActor
|
|
struct InnerRootView: View {
|
|
@EnvironmentObject var dataService: DataService
|
|
@EnvironmentObject var authenticator: Authenticator
|
|
|
|
@ObservedObject var viewModel: RootViewModel
|
|
|
|
@ViewBuilder private var innerBody: some View {
|
|
if authenticator.isLoggedIn {
|
|
PrimaryContentView()
|
|
#if os(iOS)
|
|
.miniPlayer()
|
|
#endif
|
|
} else {
|
|
WelcomeView()
|
|
.accessibilityElement()
|
|
.accessibilityIdentifier("welcomeView")
|
|
}
|
|
}
|
|
|
|
var body: some View {
|
|
Group {
|
|
#if os(iOS)
|
|
innerBody
|
|
#elseif os(macOS)
|
|
innerBody
|
|
.frame(minWidth: 400, idealWidth: 1200, minHeight: 400, idealHeight: 1200)
|
|
#endif
|
|
}
|
|
.onOpenURL { Authenticator.handleGoogleURL(url: $0) }
|
|
}
|
|
|
|
#if os(iOS)
|
|
// private var pushNotificationPrimerView: PushNotificationPrimer {
|
|
// PushNotificationPrimer(
|
|
// acceptAction: { viewModel.handlePushNotificationPrimerAcceptance() },
|
|
// denyAction: {
|
|
// UserDefaults.standard.set(true, forKey: UserDefaultKey.userHasDeniedPushPrimer.rawValue)
|
|
// viewModel.showPushNotificationPrimer = false
|
|
// }
|
|
// )
|
|
// }
|
|
#endif
|
|
}
|