Location/Weather: Improved logic and proper refresh of data when changing location name in the settings UI

This commit is contained in:
quadbyte 2025-08-12 08:33:42 -04:00
parent 934d4cc933
commit 618bee311b
2 changed files with 16 additions and 13 deletions

View file

@ -64,6 +64,7 @@ Item {
Layout.fillWidth: true Layout.fillWidth: true
onEditingFinished: function () { onEditingFinished: function () {
Settings.data.location.name = text Settings.data.location.name = text
Location.resetWeather();
} }
} }

View file

@ -41,10 +41,10 @@ Singleton {
} }
} }
// Every minute check if we need to fetch new weather // Every 20s check if we need to fetch new weather
Timer { Timer {
id: updateTimer id: updateTimer
interval: 60 * 1000 interval: 20 * 1000
running: true running: true
repeat: true repeat: true
onTriggered: { onTriggered: {
@ -55,6 +55,7 @@ Singleton {
// -------------------------------- // --------------------------------
function init() {// does nothing but ensure the singleton is created function init() {// does nothing but ensure the singleton is created
// do not remove // do not remove
console.log("[Location] Service started")
} }
// -------------------------------- // --------------------------------
@ -71,11 +72,11 @@ Singleton {
// -------------------------------- // --------------------------------
function updateWeather() { function updateWeather() {
if (isFetchingWeather) { if (isFetchingWeather) {
console.warn("Weather is still fetching") console.warn("[Location] Weather is still fetching")
return return
} }
if ((data.weatherLastFetch === "") || (Time.timestamp >= data.weatherLastFetch + weatherUpdateFrequency)) { if ((data.weatherLastFetch === "") || (data.weather === null) || (Time.timestamp >= data.weatherLastFetch + weatherUpdateFrequency)) {
getFreshWeather() getFreshWeather()
} }
} }
@ -84,9 +85,9 @@ Singleton {
function getFreshWeather() { function getFreshWeather() {
isFetchingWeather = true isFetchingWeather = true
if (data.latitude === "" || data.longitude === "") { if (data.latitude === "" || data.longitude === "") {
console.log("Geocoding location")
_geocodeLocation(Settings.data.location.name, function (lat, lon) { _geocodeLocation(Settings.data.location.name, function (lat, lon) {
console.log("Geocoded " + Settings.data.location.name + " to: " + lat + " / " + lon) console.log("[Location] Geocoded " + Settings.data.location.name + " to: " + lat + " / " + lon)
// Save GPS coordinates // Save GPS coordinates
data.latitude = lat data.latitude = lat
@ -101,6 +102,7 @@ Singleton {
// -------------------------------- // --------------------------------
function _geocodeLocation(locationName, callback, errorCallback) { function _geocodeLocation(locationName, callback, errorCallback) {
console.log("[Location] Geocoding from api.open-meteo.com")
var geoUrl = "https://geocoding-api.open-meteo.com/v1/search?name=" + encodeURIComponent( var geoUrl = "https://geocoding-api.open-meteo.com/v1/search?name=" + encodeURIComponent(
locationName) + "&language=en&format=json" locationName) + "&language=en&format=json"
var xhr = new XMLHttpRequest() var xhr = new XMLHttpRequest()
@ -112,13 +114,13 @@ Singleton {
if (geoData.results && geoData.results.length > 0) { if (geoData.results && geoData.results.length > 0) {
callback(geoData.results[0].latitude, geoData.results[0].longitude) callback(geoData.results[0].latitude, geoData.results[0].longitude)
} else { } else {
errorCallback("Location not found.") errorCallback("[Location] could not resolve location name")
} }
} catch (e) { } catch (e) {
errorCallback("Failed to parse geocoding data.") errorCallback("[Location] Failed to parse geocoding data: " + e)
} }
} else { } else {
errorCallback("Geocoding error: " + xhr.status) errorCallback("[Location] Geocoding error: " + xhr.status)
} }
} }
} }
@ -128,7 +130,7 @@ Singleton {
// -------------------------------- // --------------------------------
function _fetchWeather(latitude, longitude, errorCallback) { function _fetchWeather(latitude, longitude, errorCallback) {
console.log("Getting weather") console.log("[Location] Fetching weather from api.open-meteo.com")
var url = "https://api.open-meteo.com/v1/forecast?latitude=" + latitude + "&longitude=" + longitude var url = "https://api.open-meteo.com/v1/forecast?latitude=" + latitude + "&longitude=" + longitude
+ "&current_weather=true&current=relativehumidity_2m,surface_pressure&daily=temperature_2m_max,temperature_2m_min,weathercode&timezone=auto" + "&current_weather=true&current=relativehumidity_2m,surface_pressure&daily=temperature_2m_max,temperature_2m_min,weathercode&timezone=auto"
var xhr = new XMLHttpRequest() var xhr = new XMLHttpRequest()
@ -142,12 +144,12 @@ Singleton {
data.weather = weatherData data.weather = weatherData
data.weatherLastFetch = Time.timestamp data.weatherLastFetch = Time.timestamp
isFetchingWeather = false isFetchingWeather = false
console.log("Cached weather to disk") console.log("[Location] Cached weather to disk")
} catch (e) { } catch (e) {
errorCallback("Failed to parse weather data.") errorCallback("[Location] Failed to parse weather data")
} }
} else { } else {
errorCallback("Weather fetch error: " + xhr.status) errorCallback("[Location] Weather fetch error: " + xhr.status)
} }
} }
} }