diff options
Diffstat (limited to 'Solverv/SolvervApp.swift')
| -rw-r--r-- | Solverv/SolvervApp.swift | 76 |
1 files changed, 76 insertions, 0 deletions
diff --git a/Solverv/SolvervApp.swift b/Solverv/SolvervApp.swift index 0833363..a2beb1d 100644 --- a/Solverv/SolvervApp.swift +++ b/Solverv/SolvervApp.swift @@ -7,9 +7,13 @@ import SwiftUI import SwiftData +import CoreLocation +import Combine @main struct SolvervApp: App { + @StateObject private var locationManager = LocationManager() + var sharedModelContainer: ModelContainer = { let schema = Schema([ Item.self, @@ -26,7 +30,79 @@ struct SolvervApp: App { var body: some Scene { WindowGroup { ContentView() + .onAppear { + locationManager.requestLocationPermission() + } } .modelContainer(sharedModelContainer) } } + +class LocationManager: NSObject, CLLocationManagerDelegate, ObservableObject { + let manager = CLLocationManager() + @Published var objectWillChange = PassthroughSubject<Void, Never>() + + override init() { + super.init() + manager.delegate = self + } + + func requestLocationPermission() { + if manager.authorizationStatus == .notDetermined { + manager.requestWhenInUseAuthorization() + } else if manager.authorizationStatus == .authorizedWhenInUse || manager.authorizationStatus == .authorizedAlways { + fetchLocation() + } else { + // Use default location (Greenwich) + let defaultLocation = AppGroupManager.UserLocation( + latitude: 0.0, + longitude: 0.0, + timestamp: ISO8601DateFormatter().string(from: Date()), + isDefaultLocation: true + ) + AppGroupManager.shared.saveLocation(defaultLocation) + } + } + + func locationManager(_ manager: CLLocationManager, didChangeAuthorization status: CLAuthorizationStatus) { + if status == .authorizedWhenInUse || status == .authorizedAlways { + fetchLocation() + } + } + + private func fetchLocation() { + manager.startUpdatingLocation() + } + + func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { + guard let location = locations.last else { return } + + let userLocation = AppGroupManager.UserLocation( + latitude: location.coordinate.latitude, + longitude: location.coordinate.longitude, + timestamp: ISO8601DateFormatter().string(from: Date()), + isDefaultLocation: false + ) + AppGroupManager.shared.saveLocation(userLocation) + + // Calculate and cache sunrise/sunset + let sunTimes = SunTimes( + latitude: location.coordinate.latitude, + longitude: location.coordinate.longitude, + date: Date() + ) + + if let sunrise = sunTimes.sunrise(), let sunset = sunTimes.sunset() { + let formatter = ISO8601DateFormatter() + let cachedTimes = AppGroupManager.SunTimes( + date: formatter.string(from: Date()).prefix(10).description, + sunrise: formatter.string(from: sunrise), + sunset: formatter.string(from: sunset), + timestamp: formatter.string(from: Date()) + ) + AppGroupManager.shared.saveSunTimes(cachedTimes) + } + + manager.stopUpdatingLocation() + } +} |
