|
5 | 5 | * — distributes rate limits across all users instead of concentrating on server. |
6 | 6 | * — optional API key support via localStorage ('ohc_openmeteo_apikey') |
7 | 7 | * |
8 | | - * Always fetches in metric (Celsius, km/h, mm) and converts client-side. |
| 8 | + * Always fetches in metric (Celsius, km/h, mm) and converts client-side |
| 9 | + * based on the global `units` setting ('imperial' or 'metric'). |
9 | 10 | */ |
10 | 11 | import { useState, useEffect, useRef } from 'react'; |
11 | 12 |
|
@@ -67,15 +68,16 @@ const cToF = (c) => (c * 9) / 5 + 32; |
67 | 68 | const kmhToMph = (k) => k * 0.621371; |
68 | 69 | const mmToInch = (mm) => mm * 0.0393701; |
69 | 70 | const kmToMi = (km) => km * 0.621371; |
| 71 | +const hPaToInHg = (hPa) => hPa * 0.02953; |
70 | 72 |
|
71 | 73 | /** |
72 | 74 | * Convert raw Open-Meteo API response to display-ready weather data. |
73 | 75 | * Exported so WeatherPanel can use pre-fetched data without its own hook. |
74 | 76 | */ |
75 | | -export function convertWeatherData(rawData, tempUnit = 'F') { |
| 77 | +export function convertWeatherData(rawData, units = 'imperial') { |
76 | 78 | if (!rawData) return null; |
77 | 79 |
|
78 | | - const isMetric = tempUnit === 'C'; |
| 80 | + const isMetric = units === 'metric'; |
79 | 81 | const current = rawData.current || {}; |
80 | 82 | const daily = rawData.daily || {}; |
81 | 83 | const hourly = rawData.hourly || {}; |
@@ -131,7 +133,12 @@ export function convertWeatherData(rawData, tempUnit = 'F') { |
131 | 133 | icon: weather.icon, |
132 | 134 | humidity: Math.round(current.relative_humidity_2m || 0), |
133 | 135 | dewPoint: convTemp(current.dew_point_2m), |
134 | | - pressure: current.pressure_msl ? current.pressure_msl.toFixed(1) : null, |
| 136 | + pressure: current.pressure_msl |
| 137 | + ? isMetric |
| 138 | + ? current.pressure_msl.toFixed(1) |
| 139 | + : hPaToInHg(current.pressure_msl).toFixed(2) |
| 140 | + : null, |
| 141 | + pressureUnit: isMetric ? 'hPa' : 'inHg', |
135 | 142 | cloudCover: current.cloud_cover || 0, |
136 | 143 | windSpeed: convWind(current.wind_speed_10m), |
137 | 144 | windDir: windDirection(current.wind_direction_10m), |
@@ -197,7 +204,7 @@ async function fetchOpenMeteoDirect(lat, lon) { |
197 | 204 | return data; |
198 | 205 | } |
199 | 206 |
|
200 | | -export const useWeather = (location, tempUnit = 'F') => { |
| 207 | +export const useWeather = (location, units = 'imperial') => { |
201 | 208 | const [rawData, setRawData] = useState(null); |
202 | 209 | const [loading, setLoading] = useState(true); |
203 | 210 | const [error, setError] = useState(null); // { message, retryIn } |
@@ -255,8 +262,8 @@ export const useWeather = (location, tempUnit = 'F') => { |
255 | 262 | }; |
256 | 263 | }, [location?.lat, location?.lon]); |
257 | 264 |
|
258 | | - // Convert raw API data to display data based on current tempUnit |
259 | | - const data = convertWeatherData(rawData, tempUnit); |
| 265 | + // Convert raw API data to display data based on current units |
| 266 | + const data = convertWeatherData(rawData, units); |
260 | 267 |
|
261 | 268 | return { data, loading, error }; |
262 | 269 | }; |
|
0 commit comments