// // Luminate.swift // // Copyright 2026 Brendan Szymanski // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . // // SPDX-License-Identifier: GPL-3.0-or-later // import Foundation import LuminateCore import LuminateServices import LuminateStore import LuminateUI import Portico /// The Luminate application entry point. /// /// Owns the process-wide Jellyfin client and publishes it to the whole view tree; preferences /// install themselves through `Preferences.bootstrap(_:)`. @main struct Luminate: App { var applicationId: String? { AppInfo.identifier } private let jellyfin: JellyfinClient private let sessionBinder: ClientSessionBinder init() { LogBootstrap.bootstrap() Preferences.bootstrap(PreferenceBackend.open()) jellyfin = JellyfinClient( configuration: JellyfinClientConfiguration( serverURL: Preferences.shared[.serverURL], accessToken: Preferences.shared[.accessToken] ) ) sessionBinder = ClientSessionBinder(client: jellyfin) } var body: some Scene { ApplicationWindow { _ in RootView() .environment(\.client, jellyfin) } } } /// The root of the window's view tree. /// /// Reads the injected client and a preference so a launch proves both resolve end to end. private struct RootView: View { @Environment(\.client) private var jellyfinClient @Preference(.serverURL) private var serverURL: URL? var body: some View { Label { serverURL?.absoluteString ?? "No server configured" } } }