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..fb2e808f1 100644 --- a/edge-apps/weather/screenly.yml +++ b/edge-apps/weather/screenly.yml @@ -5,9 +5,20 @@ 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: + type: string + default_value: 'false' + title: Display Errors + optional: true + help_text: + 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 eaacbe9a9..a63f150e9 100644 --- a/edge-apps/weather/screenly_qc.yml +++ b/edge-apps/weather/screenly_qc.yml @@ -5,9 +5,20 @@ 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: + type: string + default_value: 'false' + title: Display Errors + optional: true + help_text: + 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/src/main.ts b/edge-apps/weather/src/main.ts index e0aceda33..4dfc822b1 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,46 +147,44 @@ async function updateWeatherDisplay( } document.addEventListener('DOMContentLoaded', async () => { - 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 - } + setupErrorHandling() + + 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() })