From 5762677946a244ef1496dff2846fe70e7d85ea69 Mon Sep 17 00:00:00 2001 From: Garth Vander Houwen Date: Tue, 18 Nov 2025 11:28:18 -0800 Subject: [PATCH] Prevent nil environment metrics --- .../Views/Nodes/Helpers/NodeDetail.swift | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift index efdcabb3..69e6ee4e 100644 --- a/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift +++ b/Meshtastic/Views/Nodes/Helpers/NodeDetail.swift @@ -40,7 +40,7 @@ struct NodeDetail: View { context: context ) Section("Hardware") { - + NodeInfoItem(node: node) // .id("topOfList") } @@ -260,18 +260,18 @@ struct NodeDetail: View { // Update the state with the new height self.environmentSectionHeight = newHeight } - } else { + } else if let metrics = node.latestEnvironmentMetrics { // 👈 REFACTORED: Unwraps metrics safely VStack { - if node.latestEnvironmentMetrics?.iaq ?? -1 > 0 { - IndoorAirQuality(iaq: Int(node.latestEnvironmentMetrics?.iaq ?? 0), displayMode: .gradient) + if metrics.iaq ?? -1 > 0 { // Use unwrapped 'metrics' + IndoorAirQuality(iaq: Int(metrics.iaq ?? 0), displayMode: .gradient) .padding(.vertical) } LazyVGrid(columns: gridItemLayout) { - if let temperature = node.latestEnvironmentMetrics?.temperature?.shortFormattedTemperature() { + if let temperature = metrics.temperature?.shortFormattedTemperature() { WeatherConditionsCompactWidget(temperature: String(temperature), symbolName: "cloud.sun", description: "TEMP") } - if let humidity = node.latestEnvironmentMetrics?.relativeHumidity { - if let temperature = node.latestEnvironmentMetrics?.temperature { + if let humidity = metrics.relativeHumidity { + if let temperature = metrics.temperature { let dewPoint = calculateDewPoint(temp: temperature, relativeHumidity: humidity) .formatted(.number.precision(.fractionLength(0))) + "°" HumidityCompactWidget(humidity: Int(humidity), dewPoint: dewPoint) @@ -279,17 +279,17 @@ struct NodeDetail: View { HumidityCompactWidget(humidity: Int(humidity), dewPoint: nil) } } - if let pressure = node.latestEnvironmentMetrics?.barometricPressure { + if let pressure = metrics.barometricPressure { PressureCompactWidget(pressure: pressure.formatted(.number.precision(.fractionLength(2))), unit: "hPA", low: pressure <= 1009.144) } - if let windSpeed = node.latestEnvironmentMetrics?.windSpeed { + if let windSpeed = metrics.windSpeed { let windSpeedMeasurement = Measurement(value: Double(windSpeed), unit: UnitSpeed.metersPerSecond) - let windGust = node.latestEnvironmentMetrics?.windGust.map { Measurement(value: Double($0), unit: UnitSpeed.metersPerSecond) } - let direction = cardinalValue(from: Double(node.latestEnvironmentMetrics?.windDirection ?? 0)) + let windGust = metrics.windGust.map { Measurement(value: Double($0), unit: UnitSpeed.metersPerSecond) } + let direction = cardinalValue(from: Double(metrics.windDirection ?? 0)) // Use unwrapped 'metrics' WindCompactWidget(speed: windSpeedMeasurement.formatted(.measurement(width: .abbreviated, numberFormatStyle: .number.precision(.fractionLength(0)))), - gust: node.latestEnvironmentMetrics?.windGust ?? 0.0 > 0.0 ? windGust?.formatted(.measurement(width: .abbreviated, numberFormatStyle: .number.precision(.fractionLength(0)))) : "", direction: direction) + gust: metrics.windGust ?? 0.0 > 0.0 ? windGust?.formatted(.measurement(width: .abbreviated, numberFormatStyle: .number.precision(.fractionLength(0)))) : "", direction: direction) } - if let rainfall1h = node.latestEnvironmentMetrics?.rainfall1H { + if let rainfall1h = metrics.rainfall1H { let locale = NSLocale.current as NSLocale let usesMetricSystem = locale.usesMetricSystem // Returns true for metric (mm), false for imperial (inches) let unit = usesMetricSystem ? UnitLength.millimeters : UnitLength.inches @@ -299,7 +299,7 @@ struct NodeDetail: View { let formattedRain = measurement.converted(to: unit).value.formatted(.number.precision(.fractionLength(decimals))) RainfallCompactWidget(timespan: .rainfall1H, rainfall: formattedRain, unit: unitLabel) } - if let rainfall24h = node.latestEnvironmentMetrics?.rainfall24H { + if let rainfall24h = metrics.rainfall24H { let locale = NSLocale.current as NSLocale let usesMetricSystem = locale.usesMetricSystem // Returns true for metric (mm), false for imperial (inches) let unit = usesMetricSystem ? UnitLength.millimeters : UnitLength.inches @@ -309,26 +309,26 @@ struct NodeDetail: View { let formattedRain = measurement.converted(to: unit).value.formatted(.number.precision(.fractionLength(decimals))) RainfallCompactWidget(timespan: .rainfall24H, rainfall: formattedRain, unit: unitLabel) } - if let radiation = node.latestEnvironmentMetrics?.radiation { + if let radiation = metrics.radiation { RadiationCompactWidget(radiation: radiation.formatted(.number.precision(.fractionLength(1))), unit: "µR/hr") } - if let weight = node.latestEnvironmentMetrics?.weight { + if let weight = metrics.weight { WeightCompactWidget(weight: weight.formatted(.number.precision(.fractionLength(1))), unit: "kg") } - if let distance = node.latestEnvironmentMetrics?.distance { + if let distance = metrics.distance { DistanceCompactWidget(distance: distance.formatted(.number.precision(.fractionLength(0))), unit: "mm") } - if let soilTemperature = node.latestEnvironmentMetrics?.soilTemperature { + if let soilTemperature = metrics.soilTemperature { let locale = NSLocale.current as NSLocale let localeUnit = locale.object(forKey: NSLocale.Key(rawValue: "kCFLocaleTemperatureUnitKey")) let unit = localeUnit as? String ?? "Celsius" == "Fahrenheit" ? "°F" : "°C" SoilTemperatureCompactWidget(temperature: soilTemperature.localeTemperature().formatted(.number.precision(.fractionLength(0))), unit: unit) } - if let soilMoisture = node.latestEnvironmentMetrics?.soilMoisture { + if let soilMoisture = metrics.soilMoisture { SoilMoistureCompactWidget(moisture: soilMoisture.formatted(.number.precision(.fractionLength(0))), unit: "%") } } - .padding(node.latestEnvironmentMetrics?.iaq ?? -1 > 0 ? .bottom : .vertical) + .padding(metrics.iaq ?? -1 > 0 ? .bottom : .vertical) } } }