import Foundation import WeatherKit import CoreLocation @available(iOS 16.0, *) @objc(WeatherKitBridge) class WeatherKitBridge: NSObject { let service = WeatherService.shared @objc static func requiresMainQueueSetup() -> Bool { return false } @available(iOS 16.0, *) @objc func getWeather(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { let location = CLLocation(latitude: lat, longitude: lon) Task { do { let weather = try await service.weather(for: location) let current = weather.currentWeather let result: [String: Any] = [ "temperature": current.temperature.value, "humidity": current.humidity * 100, "condition": current.condition.rawValue, "pressure": current.pressure.value, "uvIndex": current.uvIndex.value, "windSpeed": current.wind.speed.value as Any, "isDaylight": current.isDaylight, "visibility": current.visibility.value as Any ] resolve(result) } catch { reject("weatherkit", error.localizedDescription, error) } } } @available(iOS 16.0, *) @objc func getDailyForecast(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { let location = CLLocation(latitude: lat, longitude: lon) Task { do { let weather = try await service.weather(for: location) let daily = weather.dailyForecast.prefix(3).map { day in return [ "high": day.highTemperature.value, "low": day.lowTemperature.value, "condition": day.condition.rawValue, "precipitationChance": day.precipitationChance * 100 ] as [String : Any] } resolve(daily) } catch { reject("weatherkit", error.localizedDescription, error) } } } @objc func getHourlyForecast(_ lat: Double, lon: Double, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) { let location = CLLocation(latitude: lat, longitude: lon) Task { do { let weather = try await service.weather(for: location) let hourly = weather.hourlyForecast.prefix(6).map { hour in return [ "temperature": hour.temperature.value, "condition": hour.condition.rawValue, "precipitationChance": hour.precipitationChance * 100, "date": hour.date.timeIntervalSince1970 * 1000 ] as [String : Any] } resolve(hourly) } catch { reject("weatherkit", error.localizedDescription, error) } } } }