mirror of
https://github.com/meshtastic/Meshtastic-Apple.git
synced 2026-04-20 22:13:56 +00:00
* Update messaging list separator insets
* Dont show unread messages or notifications for emoji reactions matching iMessage.
* Restore ble state method (#1416)
* Restore BLE State
* Log privacy
* AccessoryManager to handle restored connection
* Comment task out
* Update restore state function based on conversation with jake
* Update Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Two Column Node List (#1425)
* Restore BLE State
* Log privacy
* AccessoryManager to handle restored connection
* Comment task out
* Switch the node list to a two column layout
* Keep asian translations of channel details string
* Update restore state function based on conversation with jake
* Update Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLETransport.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* always show node list search bar
* Update auto correct modifier
* Dont show online animations for ios 17, remove online animation from node map, remove online circle from position popover
* Work in progress.
* Update detents
* Gate the discovery process while restoring
* Use geometry reader to size weather tiles on node details
* Update BLE Transport
* Update location weather condistion styles
* Log privacy in didReceive
* Remove extra dividers from admin key config, fix onboarding typo
* Bump minimum catalyst target
* Bump mac target version
* Use @FetchRequest for UserList to try and use less memory on ios 17
* Revert change to @fetchrequest
* Stab in the dark for Devices crash
* Updated UserList (back?) to @FetchRequest
* Set mac minimum to 15
* Nil out continuation after use
* Use @FetchRequest for the node list to stop crashes on iOS 17
* Handle failed connections during restoration
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update protos
* Update protos
* Remove stale keys
* Serbian translations update (#1422)
* Log privacy
* Add Serbian translations
---------
Co-authored-by: Garth Vander Houwen <garthvh@yahoo.com>
* Clarify public key sub-text in security settings (#1412)
* Clarify public key sub-text in settings
* Trigger lint
* freq slot num pad (#1410)
* kill keyboard toolbar on lora config
* delete extranious scrollDismissesKeyboard
* Properly set catalyst target
* Update Meshtastic/Views/Onboarding/DeviceOnboarding.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Views/Settings/Config/SecurityConfig.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Update Meshtastic/Enums/DeviceEnums.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Make current location nilable, remove log spam
* clean up toUser logic
* Fix telemetry entity not added in nodeInfoPacket
* fix typo: powerMetrics.hasChXCurrent mismatch
* Duplicate decoding of telemetry.current removed
* Clean up mesh map fetch request and distance filter logic
* Revert attempt to fix message logic
* Bump datadog version
* Missing message fix, attempt #2 (#1431)
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Retry fewer times for longer
* Revert "Missing message fix, attempt #2 (#1431)" (#1432)
This reverts commit a96d318adb.
* Make retry 2 seconds
* Add back link to node details from position popover without navigation stack and link, clear notifications when deleting database
* Add clear notifications function
* Link from channel messages to node info
* Link to node details
* Discovery on retry fix
* Discovery on retry fix fix
* Add contact to device node db if you get an encrypted send faild routing error
* Seperate channel message view into two views for better performance.
* Refactor User Message List
* Update device hardware
Add liquid glass to config save button
* Save button cleanup
* Update button structure on users view
* Move encrypted send logic out of the router. Update protos
* Restore node long- and short- names (#1442)
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
* Update Meshtastic/Accessory/Transports/Bluetooth Low Energy/BLEConnection.swift
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
* Revert routing error
* Toggle for enabling device telemetry broadcast enable
* Update
* Enhancements for interval dropdowns (#1445)
* Cleanup
* Fix core data version
* Add never to update interval
* Device telemetry Enabled Boolean (#1446)
* Update core data and interval picker
* Move formatter
* Rework to nest options under enabled
* Clearer names
* Safer devicehardware api call, remove node history filter from mesh map
* Fix build
* Simplify mesh map filter
* Remove stale translation keys
---------
Co-authored-by: Jake-B <jake-b@users.noreply.github.com>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Nikola Dašić <dasic.nikola@yandex.com>
Co-authored-by: Spencer Smith <dontaskspencer@gmail.com>
Co-authored-by: Benjamin Faershtein <119711889+RCGV1@users.noreply.github.com>
Co-authored-by: Ben Meadors <benmmeadors@gmail.com>
120 lines
4.8 KiB
Swift
120 lines
4.8 KiB
Swift
import SwiftUI
|
|
import MapKit
|
|
import WeatherKit
|
|
import OSLog
|
|
|
|
struct LocalWeatherConditions: View {
|
|
@State var location: CLLocation?
|
|
/// Weather
|
|
/// The current weather condition for the city.
|
|
@State private var condition: WeatherCondition?
|
|
@State private var temperature: String = ""
|
|
@State private var dewPoint: String = ""
|
|
@State private var humidity: Int?
|
|
@State private var pressure: Measurement<UnitPressure>?
|
|
@State private var windSpeed: String = ""
|
|
@State private var windGust: String = ""
|
|
@State private var windDirection: Measurement<UnitAngle>?
|
|
@State private var windCompassDirection: String = ""
|
|
@State private var symbolName: String = "cloud.fill"
|
|
@State private var attributionLink: URL?
|
|
@State private var attributionLogo: URL?
|
|
@Environment(\.colorScheme) var colorScheme: ColorScheme
|
|
|
|
var body: some View {
|
|
if location != nil {
|
|
GeometryReader { geometry in
|
|
VStack(alignment: .center) {
|
|
// Determine the number of columns based on the screen width
|
|
let columns = geometry.size.width > 600 ? 4 : 2
|
|
let gridItemLayout = Array(repeating: GridItem(.flexible(), spacing: 20), count: columns)
|
|
|
|
LazyVGrid(columns: gridItemLayout) {
|
|
WeatherConditionsCompactWidget(temperature: temperature, symbolName: symbolName, description: condition?.description.uppercased() ?? "??")
|
|
.padding(.bottom, columns == 2 ? 10 : 0)
|
|
HumidityCompactWidget(humidity: humidity ?? 0, dewPoint: dewPoint)
|
|
.padding(.bottom, columns == 2 ? 10 : 0)
|
|
PressureCompactWidget(pressure: String(pressure?.value ?? 0.0 / 100), unit: pressure?.unit.symbol ?? "??", low: pressure?.value ?? 0.0 <= 1009.144)
|
|
WindCompactWidget(speed: windSpeed, gust: windGust, direction: windCompassDirection)
|
|
}
|
|
|
|
HStack {
|
|
AsyncImage(url: attributionLogo) { image in
|
|
image
|
|
.resizable()
|
|
.scaledToFit()
|
|
.frame(height: 10)
|
|
} placeholder: {
|
|
ProgressView()
|
|
.controlSize(.mini)
|
|
}
|
|
Link("Other data sources", destination: attributionLink ?? URL(string: "https://weather-data.apple.com/legal-attribution.html")!)
|
|
.font(.caption2)
|
|
}
|
|
.offset(y: -2)
|
|
.padding(.bottom, -15)
|
|
}
|
|
.background(
|
|
// Use GeometryReader here to get the VGrid's height
|
|
GeometryReader { proxy in
|
|
// Set the preference key with the VGrid's height
|
|
Color.clear.preference(key: WeatherKitTilesHeightKey.self, value: proxy.size.height)
|
|
}
|
|
)
|
|
}
|
|
.task {
|
|
do {
|
|
if location != nil {
|
|
let weather = try await WeatherService.shared.weather(for: location!)
|
|
let numFormatter = NumberFormatter()
|
|
let measurementFormatter = MeasurementFormatter()
|
|
numFormatter.maximumFractionDigits = 0
|
|
measurementFormatter.numberFormatter = numFormatter
|
|
measurementFormatter.unitStyle = .short
|
|
measurementFormatter.locale = Locale.current
|
|
condition = weather.currentWeather.condition
|
|
temperature = measurementFormatter.string(from: weather.currentWeather.temperature)
|
|
dewPoint = measurementFormatter.string(from: weather.currentWeather.dewPoint)
|
|
humidity = Int(weather.currentWeather.humidity * 100)
|
|
pressure = weather.currentWeather.pressure
|
|
windSpeed = measurementFormatter.string(from: weather.currentWeather.wind.speed)
|
|
windGust = measurementFormatter.string(from: weather.currentWeather.wind.gust ?? Measurement(value: 0.0, unit: weather.currentWeather.wind.gust!.unit))
|
|
windDirection = weather.currentWeather.wind.direction
|
|
windCompassDirection = weather.currentWeather.wind.compassDirection.description
|
|
symbolName = weather.currentWeather.symbolName
|
|
let attribution = try await WeatherService.shared.attribution
|
|
attributionLink = attribution.legalPageURL
|
|
attributionLogo = colorScheme == .light ? attribution.combinedMarkLightURL : attribution.combinedMarkDarkURL
|
|
}
|
|
} catch {
|
|
Logger.services.error("Could not gather weather information: \(error.localizedDescription, privacy: .public)")
|
|
condition = .clear
|
|
symbolName = "cloud.fill"
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/// Magnus Formula
|
|
func calculateDewPoint(temp: Float, relativeHumidity: Float, convertToLocale: Bool = true) -> Double {
|
|
let a: Float = 17.27
|
|
let b: Float = 237.7
|
|
let alpha = ((a * temp) / (b + temp)) + log(relativeHumidity / 100.0)
|
|
let dewPoint = (b * alpha) / (a - alpha)
|
|
let dewPointUnit = Measurement<UnitTemperature>(value: Double(dewPoint), unit: .celsius)
|
|
|
|
if !convertToLocale {
|
|
return Double(dewPoint)
|
|
}
|
|
|
|
// Otherwise convert to locale units, default behavior
|
|
let locale = NSLocale.current as NSLocale
|
|
let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey"))
|
|
var format: UnitTemperature = .celsius
|
|
|
|
if localeUnit! as? String == "Fahrenheit" {
|
|
format = .fahrenheit
|
|
}
|
|
return dewPointUnit.converted(to: format).value
|
|
}
|