diff --git a/Bar/Modules/Calendar.qml b/Bar/Modules/Calendar.qml index b034681..55f1b83 100644 --- a/Bar/Modules/Calendar.qml +++ b/Bar/Modules/Calendar.qml @@ -5,7 +5,7 @@ import Quickshell import qs.Components import qs.Settings import Quickshell.Wayland -import "root:/Helpers/Holidays.js" as Holidays +import "../../Helpers/Holidays.js" as Holidays PanelWithOverlay { id: calendarOverlay diff --git a/Helpers/Holidays.js b/Helpers/Holidays.js index a5879a6..4bb3a60 100644 --- a/Helpers/Holidays.js +++ b/Helpers/Holidays.js @@ -1,4 +1,6 @@ var _countryCode = null; +var _regionCode = null; +var _regionName = null; var _holidaysCache = {}; function getCountryCode(callback) { @@ -7,11 +9,13 @@ function getCountryCode(callback) { return; } var xhr = new XMLHttpRequest(); - xhr.open("GET", "http://ip-api.com/json/", true); + xhr.open("GET", "https://nominatim.openstreetmap.org/search?city="+ Settings.settings.weatherCity+"&country=&format=json&addressdetails=1&extratags=1", true); xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { var response = JSON.parse(xhr.responseText); - _countryCode = response.countryCode; + _countryCode = response?.[0]?.address?.country_code ?? "US"; + _regionCode = response?.[0]?.address?.["ISO3166-2-lvl4"] ?? ""; + _regionName = response?.[0]?.address?.state ?? ""; callback(_countryCode); } } @@ -30,17 +34,43 @@ function getHolidays(year, countryCode, callback) { xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE && xhr.status === 200) { var holidays = JSON.parse(xhr.responseText); - _holidaysCache[cacheKey] = holidays; - callback(holidays); + var augmentedHolidays = filterHolidaysByRegion(holidays); + _holidaysCache[cacheKey] = augmentedHolidays; + callback(augmentedHolidays); } } xhr.send(); } +function filterHolidaysByRegion(holidays) { + if (!_regionCode) { + return holidays; + } + const retHolidays = []; + holidays.forEach(function(holiday) { + if (holiday.counties?.length > 0) { + let found = false; + holiday.counties.forEach(function(county) { + if (county.toLowerCase() === _regionCode.toLowerCase()) { + found = true; + } + }); + if (found) { + var regionText = " (" + _regionName + ")"; + holiday.name = holiday.name + regionText; + holiday.localName = holiday.localName + regionText; + retHolidays.push(holiday); + } + } else { + retHolidays.push(holiday); + } + }); + return retHolidays; +} + function getHolidaysForMonth(year, month, callback) { getCountryCode(function(countryCode) { getHolidays(year, countryCode, function(holidays) { - // 0-based months (0=Jan, 11=Dec) var filtered = holidays.filter(function(h) { var date = new Date(h.date); return date.getFullYear() === year && date.getMonth() === month; diff --git a/Widgets/Sidebar/Config/SettingsModal.qml b/Widgets/Sidebar/Config/SettingsModal.qml index 9e17195..bd31390 100644 --- a/Widgets/Sidebar/Config/SettingsModal.qml +++ b/Widgets/Sidebar/Config/SettingsModal.qml @@ -17,17 +17,12 @@ PanelWindow { anchors.right: true margins.right: 0 margins.top: 0 - //z: 100 - //border.color: Theme.outline - //border.width: 1 WlrLayershell.keyboardFocus: WlrKeyboardFocus.OnDemand Rectangle { anchors.fill: parent color: Theme.backgroundPrimary radius: 24 - //border.color: Theme.outline - //border.width: 1 z: 0 ColumnLayout { @@ -187,9 +182,12 @@ PanelWindow { // Release focus when modal becomes invisible onVisibleChanged: { - if (!visible) - // Focus will be handled by the individual components - {} + if (!visible) { + // Focus will be handled by the individual components + if (typeof weather !== 'undefined' && weather !== null && weather.fetchCityWeather) { + weather.fetchCityWeather(); + } + } } }