From 576e0ff71fc5fe37d23c13c24c516ba378bf10e8 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Mon, 6 Apr 2026 16:01:27 -0700 Subject: [PATCH 1/3] feat(weather): add display_errors setting - Add display_errors setting to screenly.yml and screenly_qc.yml - Call setupErrorHandling() in main.ts on DOMContentLoaded - Add display_errors to e2e screenshot mock settings - Document display_errors in README.md Co-Authored-By: Claude Sonnet 4.6 --- edge-apps/weather/README.md | 1 + edge-apps/weather/e2e/screenshots.spec.ts | 1 + edge-apps/weather/screenly.yml | 11 +++++++++++ edge-apps/weather/screenly_qc.yml | 11 +++++++++++ edge-apps/weather/src/main.ts | 3 +++ 5 files changed, 27 insertions(+) diff --git a/edge-apps/weather/README.md b/edge-apps/weather/README.md index d5712608e..3f84852c3 100644 --- a/edge-apps/weather/README.md +++ b/edge-apps/weather/README.md @@ -22,6 +22,7 @@ The app accepts the following settings via `screenly.yml`: | Setting | Description | Type | Default | | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------ | ------- | +| `display_errors` | For debugging purposes to display errors on the screen. | optional, advanced | `false` | | `openweathermap_api_key` | OpenWeatherMap API key to access weather data and location information. Get your API key from the [OpenWeatherMap API](https://openweathermap.org/api) | required | - | | `override_coordinates` | Comma-separated coordinates (e.g., `37.8267,-122.4233`) to override device location | optional | - | | `override_locale` | Override the default locale with a supported language code | optional | `en` | diff --git a/edge-apps/weather/e2e/screenshots.spec.ts b/edge-apps/weather/e2e/screenshots.spec.ts index fdb9fb43a..b19cd3af8 100644 --- a/edge-apps/weather/e2e/screenshots.spec.ts +++ b/edge-apps/weather/e2e/screenshots.spec.ts @@ -20,6 +20,7 @@ const { screenlyJsContent } = createMockScreenlyForScreenshots( location: 'Mountain View, CA', }, { + display_errors: 'false', override_timezone: 'America/Los_Angeles', override_locale: 'en', openweathermap_api_key: 'mock-api-key', diff --git a/edge-apps/weather/screenly.yml b/edge-apps/weather/screenly.yml index 77f509379..d0a462acc 100644 --- a/edge-apps/weather/screenly.yml +++ b/edge-apps/weather/screenly.yml @@ -8,6 +8,17 @@ categories: - Utilities ready_signal: true settings: + display_errors: + type: string + default_value: 'false' + title: Display Errors + optional: true + help_text: + schema_version: 1 + properties: + advanced: true + help_text: For debugging purposes to display errors on the screen. + type: boolean enable_analytics: type: string default_value: 'true' diff --git a/edge-apps/weather/screenly_qc.yml b/edge-apps/weather/screenly_qc.yml index eaacbe9a9..38727ff52 100644 --- a/edge-apps/weather/screenly_qc.yml +++ b/edge-apps/weather/screenly_qc.yml @@ -8,6 +8,17 @@ categories: - Utilities ready_signal: true settings: + display_errors: + type: string + default_value: 'false' + title: Display Errors + optional: true + help_text: + schema_version: 1 + properties: + advanced: true + help_text: For debugging purposes to display errors on the screen. + type: boolean enable_analytics: type: string default_value: 'true' diff --git a/edge-apps/weather/src/main.ts b/edge-apps/weather/src/main.ts index e0aceda33..5b79f6a59 100644 --- a/edge-apps/weather/src/main.ts +++ b/edge-apps/weather/src/main.ts @@ -8,6 +8,7 @@ import { getSetting, getCityInfo, resolveMeasurementUnit, + setupErrorHandling, type MeasurementUnit, } from '@screenly/edge-apps' import '@screenly/edge-apps/components' @@ -146,6 +147,8 @@ async function updateWeatherDisplay( } document.addEventListener('DOMContentLoaded', async () => { + setupErrorHandling() + try { locationEl = document.querySelector('[data-location]') temperatureEl = document.querySelector('[data-temperature]') From 12a5925ac56209ffda56291ef783b9b26163b120 Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Mon, 6 Apr 2026 21:27:36 -0700 Subject: [PATCH 2/3] chore(weather): fix YAML formatting in manifest files - Use unindented list style for categories - Move schema_version after properties in display_errors help_text Co-Authored-By: Claude Sonnet 4.6 --- edge-apps/weather/screenly.yml | 4 ++-- edge-apps/weather/screenly_qc.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/edge-apps/weather/screenly.yml b/edge-apps/weather/screenly.yml index d0a462acc..fb2e808f1 100644 --- a/edge-apps/weather/screenly.yml +++ b/edge-apps/weather/screenly.yml @@ -5,7 +5,7 @@ description: Displays the current weather and time icon: https://playground.srly.io/edge-apps/weather/static/img/icon.svg author: Screenly, Inc. categories: - - Utilities +- Utilities ready_signal: true settings: display_errors: @@ -14,11 +14,11 @@ settings: title: Display Errors optional: true help_text: - schema_version: 1 properties: advanced: true help_text: For debugging purposes to display errors on the screen. type: boolean + schema_version: 1 enable_analytics: type: string default_value: 'true' diff --git a/edge-apps/weather/screenly_qc.yml b/edge-apps/weather/screenly_qc.yml index 38727ff52..a63f150e9 100644 --- a/edge-apps/weather/screenly_qc.yml +++ b/edge-apps/weather/screenly_qc.yml @@ -5,7 +5,7 @@ description: Displays the current weather and time icon: https://playground.srly.io/edge-apps/weather/static/img/icon.svg author: Screenly, Inc. categories: - - Utilities +- Utilities ready_signal: true settings: display_errors: @@ -14,11 +14,11 @@ settings: title: Display Errors optional: true help_text: - schema_version: 1 properties: advanced: true help_text: For debugging purposes to display errors on the screen. type: boolean + schema_version: 1 enable_analytics: type: string default_value: 'true' From da29e0e9e40fe3a470715a1fc48fdbb8159c45fb Mon Sep 17 00:00:00 2001 From: nicomiguelino Date: Mon, 6 Apr 2026 22:25:04 -0700 Subject: [PATCH 3/3] refactor(weather): remove try/catch from DOMContentLoaded handler - Drop try/catch so unhandled errors propagate to panic-overlay - Move signalReady() to end of happy path Co-Authored-By: Claude Sonnet 4.6 --- edge-apps/weather/src/main.ts | 64 ++++++++++++++++------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/edge-apps/weather/src/main.ts b/edge-apps/weather/src/main.ts index 5b79f6a59..4dfc822b1 100644 --- a/edge-apps/weather/src/main.ts +++ b/edge-apps/weather/src/main.ts @@ -149,46 +149,42 @@ async function updateWeatherDisplay( document.addEventListener('DOMContentLoaded', async () => { setupErrorHandling() - try { - locationEl = document.querySelector('[data-location]') - temperatureEl = document.querySelector('[data-temperature]') - weatherDescriptionEl = document.querySelector('[data-weather-description]') - tempHighEl = document.querySelector('[data-temp-high]') - tempLowEl = document.querySelector('[data-temp-low]') - forecastItemsEl = document.querySelector('[data-forecast-items]') - forecastCardEl = document.querySelector('[data-forecast-card]') - forecastHeaderIconEl = document.querySelector('[data-forecast-header-icon]') - - // Set forecast header icon - if (forecastHeaderIconEl) { - forecastHeaderIconEl.src = sunIcon - } + locationEl = document.querySelector('[data-location]') + temperatureEl = document.querySelector('[data-temperature]') + weatherDescriptionEl = document.querySelector('[data-weather-description]') + tempHighEl = document.querySelector('[data-temp-high]') + tempLowEl = document.querySelector('[data-temp-low]') + forecastItemsEl = document.querySelector('[data-forecast-items]') + forecastCardEl = document.querySelector('[data-forecast-card]') + forecastHeaderIconEl = document.querySelector('[data-forecast-header-icon]') + + // Set forecast header icon + if (forecastHeaderIconEl) { + forecastHeaderIconEl.src = sunIcon + } - const [latitude, longitude] = getCoordinates() + const [latitude, longitude] = getCoordinates() - timezone = await getTimeZone() - locale = await getLocale() + timezone = await getTimeZone() + locale = await getLocale() - const { cityName, countryCode } = await getCityInfo(latitude, longitude) - if (locationEl) { - locationEl.textContent = cityName - } + const { cityName, countryCode } = await getCityInfo(latitude, longitude) + if (locationEl) { + locationEl.textContent = cityName + } - // Get measurement unit from settings, or auto-detect based on location - measurementUnit = resolveMeasurementUnit(countryCode) + // Get measurement unit from settings, or auto-detect based on location + measurementUnit = resolveMeasurementUnit(countryCode) - await updateWeatherDisplay(latitude, longitude, timezone, measurementUnit) + await updateWeatherDisplay(latitude, longitude, timezone, measurementUnit) - // Refresh weather every 15 minutes - setInterval( - () => { - updateWeatherDisplay(latitude, longitude, timezone, measurementUnit) - }, - 15 * 60 * 1000, - ) - } catch (error) { - console.error('Failed to initialize app:', error) - } + // Refresh weather every 15 minutes + setInterval( + () => { + updateWeatherDisplay(latitude, longitude, timezone, measurementUnit) + }, + 15 * 60 * 1000, + ) signalReady() })