This commit is contained in:
parent
edb955323d
commit
a964662940
3 changed files with 41 additions and 11 deletions
|
|
@ -28,6 +28,38 @@ const getStoredLocationMetadata = () => {
|
||||||
|
|
||||||
const isUsLocation = (location) => ['US', 'USA'].includes((location?.countryCode ?? '').toUpperCase());
|
const isUsLocation = (location) => ['US', 'USA'].includes((location?.countryCode ?? '').toUpperCase());
|
||||||
|
|
||||||
|
const isWithinBounds = (latLon, bounds) => latLon.lat >= bounds.minLat
|
||||||
|
&& latLon.lat <= bounds.maxLat
|
||||||
|
&& latLon.lon >= bounds.minLon
|
||||||
|
&& latLon.lon <= bounds.maxLon;
|
||||||
|
|
||||||
|
const isWithinUsFallbackBounds = (latLon) => [
|
||||||
|
{
|
||||||
|
minLat: 24.0,
|
||||||
|
maxLat: 49.5,
|
||||||
|
minLon: -125.0,
|
||||||
|
maxLon: -66.5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
minLat: 51.0,
|
||||||
|
maxLat: 71.5,
|
||||||
|
minLon: -179.5,
|
||||||
|
maxLon: -129.5,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
minLat: 18.5,
|
||||||
|
maxLat: 22.5,
|
||||||
|
minLon: -160.5,
|
||||||
|
maxLon: -154.5,
|
||||||
|
},
|
||||||
|
].some((bounds) => isWithinBounds(latLon, bounds));
|
||||||
|
|
||||||
|
const supportsNoaaLocation = (location, latLon) => {
|
||||||
|
if (isUsLocation(location)) return true;
|
||||||
|
if (!location?.countryCode) return isWithinUsFallbackBounds(latLon);
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
|
||||||
const getFallbackLocation = (latLon) => {
|
const getFallbackLocation = (latLon) => {
|
||||||
const query = localStorage.getItem('latLonQuery') ?? `${latLon.lat.toFixed(4)}, ${latLon.lon.toFixed(4)}`;
|
const query = localStorage.getItem('latLonQuery') ?? `${latLon.lat.toFixed(4)}, ${latLon.lon.toFixed(4)}`;
|
||||||
const [city = query, state = ''] = query.split(',').map((part) => part.trim());
|
const [city = query, state = ''] = query.split(',').map((part) => part.trim());
|
||||||
|
|
@ -94,22 +126,21 @@ const getWeather = async (latLon, haveDataCallback) => {
|
||||||
if (typeof haveDataCallback === 'function') haveDataCallback(location);
|
if (typeof haveDataCallback === 'function') haveDataCallback(location);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const supportsNoaaDisplays = isUsLocation(location);
|
const noaaEligibleLocation = supportsNoaaLocation(location, latLon);
|
||||||
const shouldTryNoaaPoint = supportsNoaaDisplays || !location.countryCode;
|
|
||||||
let point = null;
|
let point = null;
|
||||||
let stations = null;
|
let stations = null;
|
||||||
let stationId = '';
|
let stationId = '';
|
||||||
|
|
||||||
if (shouldTryNoaaPoint) {
|
if (noaaEligibleLocation) {
|
||||||
point = await getPoint(latLon.lat, latLon.lon);
|
point = await getPoint(latLon.lat, latLon.lon);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (supportsNoaaDisplays && point?.properties?.observationStations) {
|
if (noaaEligibleLocation && point?.properties?.observationStations) {
|
||||||
stations = await safeJson(point.properties.observationStations);
|
stations = await safeJson(point.properties.observationStations);
|
||||||
stationId = stations?.features?.[0]?.properties?.stationIdentifier ?? '';
|
stationId = stations?.features?.[0]?.properties?.stationIdentifier ?? '';
|
||||||
}
|
}
|
||||||
|
|
||||||
const supportsNoaaAlerts = !!(isUsLocation(location) || point);
|
const supportsNoaaAlerts = noaaEligibleLocation;
|
||||||
|
|
||||||
const state = location.state || point?.properties?.relativeLocation?.properties?.state || '';
|
const state = location.state || point?.properties?.relativeLocation?.properties?.state || '';
|
||||||
let city = location.city || point?.properties?.relativeLocation?.properties?.city || localStorage.getItem('latLonQuery') || '';
|
let city = location.city || point?.properties?.relativeLocation?.properties?.city || localStorage.getItem('latLonQuery') || '';
|
||||||
|
|
@ -129,7 +160,7 @@ const getWeather = async (latLon, haveDataCallback) => {
|
||||||
weatherParameters.timeZone = openMeteoForecast.timezone;
|
weatherParameters.timeZone = openMeteoForecast.timezone;
|
||||||
weatherParameters.forecast = aggregatedForecast;
|
weatherParameters.forecast = aggregatedForecast;
|
||||||
weatherParameters.supportsNoaaAlerts = supportsNoaaAlerts;
|
weatherParameters.supportsNoaaAlerts = supportsNoaaAlerts;
|
||||||
weatherParameters.supportsNoaaDisplays = !!(supportsNoaaDisplays && point && stations?.features?.length);
|
weatherParameters.supportsNoaaDisplays = !!(noaaEligibleLocation && point && stations?.features?.length);
|
||||||
weatherParameters.zoneId = point?.properties?.forecastZone?.substr(-6) ?? '';
|
weatherParameters.zoneId = point?.properties?.forecastZone?.substr(-6) ?? '';
|
||||||
weatherParameters.radarId = point?.properties?.radarStation?.substr(-3) ?? '';
|
weatherParameters.radarId = point?.properties?.radarStation?.substr(-3) ?? '';
|
||||||
weatherParameters.stationId = stationId;
|
weatherParameters.stationId = stationId;
|
||||||
|
|
|
||||||
|
|
@ -164,14 +164,12 @@
|
||||||
border: 0;
|
border: 0;
|
||||||
|
|
||||||
.nearby-weather-marker-inner {
|
.nearby-weather-marker-inner {
|
||||||
display: flex;
|
display: inline-flex;
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
min-width: 72px;
|
min-width: 72px;
|
||||||
padding: 2px 4px;
|
padding: 2px 4px;
|
||||||
background: rgba(18, 34, 61, 0.88);
|
background: rgb(18 34 61 / 0%);
|
||||||
border: 1px solid #000;
|
|
||||||
box-shadow: 1px 1px 0 #000;
|
|
||||||
color: #fff;
|
color: #fff;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
@ -183,6 +181,7 @@
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
margin-bottom: 1px;
|
margin-bottom: 1px;
|
||||||
text-shadow: 1px 1px 0 #000;
|
text-shadow: 1px 1px 0 #000;
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.details {
|
.details {
|
||||||
|
|
|
||||||
2
server/styles/ws.min.css
vendored
2
server/styles/ws.min.css
vendored
File diff suppressed because one or more lines are too long
Loading…
Add table
Add a link
Reference in a new issue