diff --git a/modules/menus/calendar/weather/index.ts b/modules/menus/calendar/weather/index.ts index bdef43a..bdbea17 100644 --- a/modules/menus/calendar/weather/index.ts +++ b/modules/menus/calendar/weather/index.ts @@ -5,11 +5,50 @@ import { TodayTemperature } from "./temperature/index.js"; import { Hourly } from "./hourly/index.js"; import { Weather } from "lib/types/weather.js"; import { DEFAULT_WEATHER } from "lib/types/defaults/weather.js"; +import GLib from "gi://GLib?version=2.0" const { key, interval, location } = options.menus.clock.weather; const theWeather = Variable(DEFAULT_WEATHER); +let weatherIntervalInstance: null | number = null; + +const weatherIntervalFn = (weatherInterval: number, loc: string, weatherKey: string) => { + if (weatherIntervalInstance !== null) { + GLib.source_remove(weatherIntervalInstance); + } + + const formattedLocation = loc.replace(" ", "%20"); + + weatherIntervalInstance = Utils.interval(weatherInterval, () => { + Utils.execAsync( + `curl "https://api.weatherapi.com/v1/forecast.json?key=${weatherKey}&q=${formattedLocation}&days=1&aqi=no&alerts=no"`, + ) + .then((res) => { + try { + if (typeof res !== "string") { + return theWeather.value = DEFAULT_WEATHER; + } + + const parsedWeather = JSON.parse(res); + + if (Object.keys(parsedWeather).includes("error")) { + return theWeather.value = DEFAULT_WEATHER; + } + + return theWeather.value = parsedWeather; + } catch (error) { + theWeather.value = DEFAULT_WEATHER; + console.warn(`Failed to parse weather data: ${error}`); + } + }) + .catch((err) => { + console.error(`Failed to fetch weather: ${err}`); + theWeather.value = DEFAULT_WEATHER; + }); + }) +}; + const WeatherWidget = () => { return Widget.Box({ class_name: "calendar-menu-item-container weather", @@ -22,37 +61,10 @@ const WeatherWidget = () => { if (!weatherKey) { return theWeather.value = DEFAULT_WEATHER; } - Utils.interval(weatherInterval, () => { - const formattedLocation = loc.replace(" ", "%20"); - Utils.execAsync( - `curl "https://api.weatherapi.com/v1/forecast.json?key=${weatherKey}&q=${formattedLocation}&days=1&aqi=no&alerts=no"`, - ) - .then((res) => { - try { - if (typeof res !== "string") { - return theWeather.value = DEFAULT_WEATHER; - } - - const parsedWeather = JSON.parse(res); - - if (Object.keys(parsedWeather).includes("error")) { - return theWeather.value = DEFAULT_WEATHER; - } - - return theWeather.value = parsedWeather; - } catch (error) { - theWeather.value = DEFAULT_WEATHER; - console.warn(`Failed to parse weather data: ${error}`); - } - }) - .catch((err) => { - console.error(`Failed to fetch weather: ${err}`); - theWeather.value = DEFAULT_WEATHER; - }); - }); + weatherIntervalFn(weatherInterval, loc, weatherKey); }, ); - + return (self.child = Widget.Box({ vertical: true, hexpand: true,