1 |
- {"version":3,"file":"weather_status-weather-status.mjs","sources":["../apps/weather_status/src/services/weatherStatusService.js","../apps/weather_status/src/App.vue","../apps/weather_status/src/weather-status.js"],"sourcesContent":["/**\n * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport HttpClient from '@nextcloud/axios'\nimport { generateOcsUrl } from '@nextcloud/router'\n\n/**\n *\n *\n * @param {string} lat the latitude\n * @param {string} lon the longitude\n * @return {Promise<object>}\n */\nconst setLocation = async (lat, lon) => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/location')\n\tconst response = await HttpClient.put(url, {\n\t\taddress: '',\n\t\tlat,\n\t\tlon,\n\t})\n\n\treturn response.data.ocs.data\n}\n\n/**\n *\n * @param {string} address The location\n * @return {Promise<object>}\n */\nconst setAddress = async (address) => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/location')\n\tconst response = await HttpClient.put(url, {\n\t\taddress,\n\t\tlat: null,\n\t\tlon: null,\n\t})\n\n\treturn response.data.ocs.data\n}\n\n/**\n *\n * @param {string} mode can be 1 browser or 2 custom\n * @return {Promise<object>}\n */\nconst setMode = async (mode) => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/mode')\n\tconst response = await HttpClient.put(url, {\n\t\tmode,\n\t})\n\n\treturn response.data.ocs.data\n}\n\n/**\n *\n * @return {Promise<object>}\n */\nconst usePersonalAddress = async () => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/use-personal')\n\tconst response = await HttpClient.put(url)\n\n\treturn response.data.ocs.data\n}\n\n/**\n * Fetches the location information for current user\n *\n * @return {Promise<object>}\n */\nconst getLocation = async () => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/location')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\n/**\n * Fetches the weather forecast\n *\n * @return {Promise<object>}\n */\nconst fetchForecast = async () => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/forecast')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\n/**\n * Fetches the location favorites\n *\n * @return {Promise<object>}\n */\nconst getFavorites = async () => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/favorites')\n\tconst response = await HttpClient.get(url)\n\n\treturn response.data.ocs.data\n}\n\n/**\n *\n * @param {Array} favorites List of favorite addresses\n * @return {Promise<object>}\n */\nconst saveFavorites = async (favorites) => {\n\tconst url = generateOcsUrl('apps/weather_status/api/v1/favorites')\n\tconst response = await HttpClient.put(url, {\n\t\tfavorites,\n\t})\n\n\treturn response.data.ocs.data\n}\n\nexport {\n\tusePersonalAddress,\n\tsetMode,\n\tgetLocation,\n\tsetLocation,\n\tsetAddress,\n\tfetchForecast,\n\tgetFavorites,\n\tsaveFavorites,\n}\n","<!--\n - SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors\n - SPDX-License-Identifier: AGPL-3.0-or-later\n-->\n\n<template>\n\t<div id=\"weather-status-menu-item\">\n\t\t<NcActions class=\"weather-status-menu-item__subheader\"\n\t\t\t:default-icon=\"weatherIcon\"\n\t\t\t:aria-hidden=\"true\"\n\t\t\t:aria-label=\"currentWeatherMessage\"\n\t\t\t:menu-name=\"currentWeatherMessage\">\n\t\t\t<NcActionText v-if=\"gotWeather\"\n\t\t\t\t:aria-hidden=\"true\"\n\t\t\t\t:icon=\"futureWeatherIcon\">\n\t\t\t\t{{ forecastMessage }}\n\t\t\t</NcActionText>\n\t\t\t<NcActionLink v-if=\"gotWeather\"\n\t\t\t\ticon=\"icon-address\"\n\t\t\t\ttarget=\"_blank\"\n\t\t\t\t:aria-hidden=\"true\"\n\t\t\t\t:href=\"weatherLinkTarget\"\n\t\t\t\t:close-after-click=\"true\">\n\t\t\t\t{{ locationText }}\n\t\t\t</NcActionLink>\n\t\t\t<NcActionButton v-if=\"gotWeather\"\n\t\t\t\t:aria-hidden=\"true\"\n\t\t\t\t@click=\"onAddRemoveFavoriteClick\">\n\t\t\t\t<template #icon>\n\t\t\t\t\t<component :is=\"addRemoveFavoriteIcon\" :size=\"20\" class=\"favorite-color\" />\n\t\t\t\t</template>\n\t\t\t\t{{ addRemoveFavoriteText }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionSeparator v-if=\"address && !errorMessage\" />\n\t\t\t<NcActionButton icon=\"icon-crosshair\"\n\t\t\t\t:close-after-click=\"true\"\n\t\t\t\t:aria-hidden=\"true\"\n\t\t\t\t@click=\"onBrowserLocationClick\">\n\t\t\t\t{{ t('weather_status', 'Detect location') }}\n\t\t\t</NcActionButton>\n\t\t\t<NcActionInput ref=\"addressInput\"\n\t\t\t\t:label=\"t('weather_status', 'Set custom address')\"\n\t\t\t\t:disabled=\"false\"\n\t\t\t\ticon=\"icon-rename\"\n\t\t\t\t:aria-hidden=\"true\"\n\t\t\t\ttype=\"text\"\n\t\t\t\tvalue=\"\"\n\t\t\t\t@submit=\"onAddressSubmit\" />\n\t\t\t<template v-if=\"favorites.length > 0\">\n\t\t\t\t<NcActionCaption :name=\"t('weather_status', 'Favorites')\" />\n\t\t\t\t<NcActionButton v-for=\"favorite in favorites\"\n\t\t\t\t\t:key=\"favorite\"\n\t\t\t\t\t:aria-hidden=\"true\"\n\t\t\t\t\t@click=\"onFavoriteClick($event, favorite)\">\n\t\t\t\t\t<template #icon>\n\t\t\t\t\t\t<IconStar :size=\"20\" :class=\"{'favorite-color': address === favorite}\" />\n\t\t\t\t\t</template>\n\t\t\t\t\t{{ favorite }}\n\t\t\t\t</NcActionButton>\n\t\t\t</template>\n\t\t</NcActions>\n\t</div>\n</template>\n\n<script>\nimport { showError } from '@nextcloud/dialogs'\nimport moment from '@nextcloud/moment'\nimport { getLocale } from '@nextcloud/l10n'\nimport IconStar from 'vue-material-design-icons/Star.vue'\nimport IconStarOutline from 'vue-material-design-icons/StarOutline.vue'\nimport NcActions from '@nextcloud/vue/dist/Components/NcActions.js'\nimport NcActionButton from '@nextcloud/vue/dist/Components/NcActionButton.js'\nimport NcActionCaption from '@nextcloud/vue/dist/Components/NcActionCaption.js'\nimport NcActionInput from '@nextcloud/vue/dist/Components/NcActionInput.js'\nimport NcActionLink from '@nextcloud/vue/dist/Components/NcActionLink.js'\nimport NcActionSeparator from '@nextcloud/vue/dist/Components/NcActionSeparator.js'\nimport NcActionText from '@nextcloud/vue/dist/Components/NcActionText.js'\nimport * as network from './services/weatherStatusService.js'\n\nconst MODE_BROWSER_LOCATION = 1\nconst MODE_MANUAL_LOCATION = 2\nconst weatherOptions = {\n\tclearsky_day: {\n\t\ticon: 'icon-clearsky-day',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} clear sky later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} clear sky', { temperature, unit }),\n\t},\n\tclearsky_night: {\n\t\ticon: 'icon-clearsky-night',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} clear sky later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} clear sky', { temperature, unit }),\n\t},\n\tcloudy: {\n\t\ticon: 'icon-cloudy',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} cloudy later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} cloudy', { temperature, unit }),\n\t},\n\tfair_day: {\n\t\ticon: 'icon-fair-day',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} fair weather later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} fair weather', { temperature, unit }),\n\t},\n\tfair_night: {\n\t\ticon: 'icon-fair-night',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} fair weather later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} fair weather', { temperature, unit }),\n\t},\n\tpartlycloudy_day: {\n\t\ticon: 'icon-partlycloudy-day',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} partly cloudy later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} partly cloudy', { temperature, unit }),\n\t},\n\tpartlycloudy_night: {\n\t\ticon: 'icon-partlycloudy-night',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} partly cloudy later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} partly cloudy', { temperature, unit }),\n\t},\n\tfog: {\n\t\ticon: 'icon-fog',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} foggy later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} foggy', { temperature, unit }),\n\t},\n\tlightrain: {\n\t\ticon: 'icon-lightrain',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} light rainfall later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} light rainfall', { temperature, unit }),\n\t},\n\train: {\n\t\ticon: 'icon-rain',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} rainfall later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} rainfall', { temperature, unit }),\n\t},\n\theavyrain: {\n\t\ticon: 'icon-heavyrain',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} heavy rainfall later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} heavy rainfall', { temperature, unit }),\n\t},\n\trainshowers_day: {\n\t\ticon: 'icon-rainshowers-day',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} rainfall showers later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} rainfall showers', { temperature, unit }),\n\t},\n\trainshowers_night: {\n\t\ticon: 'icon-rainshowers-night',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} rainfall showers later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} rainfall showers', { temperature, unit }),\n\t},\n\tlightrainshowers_day: {\n\t\ticon: 'icon-light-rainshowers-day',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} light rainfall showers later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} light rainfall showers', { temperature, unit }),\n\t},\n\tlightrainshowers_night: {\n\t\ticon: 'icon-light-rainshowers-night',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} light rainfall showers later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} light rainfall showers', { temperature, unit }),\n\t},\n\theavyrainshowers_day: {\n\t\ticon: 'icon-heavy-rainshowers-day',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} heavy rainfall showers later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} heavy rainfall showers', { temperature, unit }),\n\t},\n\theavyrainshowers_night: {\n\t\ticon: 'icon-heavy-rainshowers-night',\n\t\ttext: (temperature, unit, later = false) => later\n\t\t\t? t('weather_status', '{temperature} {unit} heavy rainfall showers later today', { temperature, unit })\n\t\t\t: t('weather_status', '{temperature} {unit} heavy rainfall showers', { temperature, unit }),\n\t},\n}\n\nexport default {\n\tname: 'App',\n\tcomponents: {\n\t\tIconStar,\n\t\tNcActions,\n\t\tNcActionButton,\n\t\tNcActionCaption,\n\t\tNcActionInput,\n\t\tNcActionLink,\n\t\tNcActionSeparator,\n\t\tNcActionText,\n\t},\n\tdata() {\n\t\treturn {\n\t\t\tlocale: getLocale(),\n\t\t\tloading: true,\n\t\t\terrorMessage: '',\n\t\t\tmode: MODE_BROWSER_LOCATION,\n\t\t\taddress: null,\n\t\t\tlat: null,\n\t\t\tlon: null,\n\t\t\t// how many hours ahead do we want to see the forecast?\n\t\t\toffset: 5,\n\t\t\tforecasts: [],\n\t\t\tloop: null,\n\t\t\tfavorites: [],\n\t\t}\n\t},\n\tcomputed: {\n\t\tuseFahrenheitLocale() {\n\t\t\treturn ['en_US', 'en_MH', 'en_FM', 'en_PW', 'en_KY', 'en_LR'].includes(this.locale)\n\t\t},\n\t\ttemperatureUnit() {\n\t\t\treturn this.useFahrenheitLocale ? '°F' : '°C'\n\t\t},\n\t\tlocationText() {\n\t\t\treturn t('weather_status', 'More weather for {adr}', { adr: this.address })\n\t\t},\n\t\ttemperature() {\n\t\t\treturn this.getTemperature(this.forecasts, 0)\n\t\t},\n\t\tfutureTemperature() {\n\t\t\treturn this.getTemperature(this.forecasts, this.offset)\n\t\t},\n\t\tweatherCode() {\n\t\t\treturn this.getWeatherCode(this.forecasts, 0)\n\t\t},\n\t\tfutureWeatherCode() {\n\t\t\treturn this.getWeatherCode(this.forecasts, this.offset)\n\t\t},\n\t\tweatherIcon() {\n\t\t\treturn this.getWeatherIcon(this.weatherCode, this.loading)\n\t\t},\n\t\tfutureWeatherIcon() {\n\t\t\treturn this.getWeatherIcon(this.futureWeatherCode, this.loading)\n\t\t},\n\t\t/**\n\t\t * The message displayed in the top right corner\n\t\t *\n\t\t * @return {string}\n\t\t */\n\t\tcurrentWeatherMessage() {\n\t\t\tif (this.loading) {\n\t\t\t\treturn t('weather_status', 'Loading weather')\n\t\t\t} else if (this.errorMessage) {\n\t\t\t\treturn this.errorMessage\n\t\t\t} else {\n\t\t\t\treturn this.getWeatherMessage(this.weatherCode, this.temperature)\n\t\t\t}\n\t\t},\n\t\tforecastMessage() {\n\t\t\tif (this.loading) {\n\t\t\t\treturn t('weather_status', 'Loading weather')\n\t\t\t} else {\n\t\t\t\treturn this.getWeatherMessage(this.futureWeatherCode, this.futureTemperature, true)\n\t\t\t}\n\t\t},\n\t\tweatherLinkTarget() {\n\t\t\treturn 'https://www.windy.com/-Rain-thunder-rain?rain,' + this.lat + ',' + this.lon + ',11'\n\t\t},\n\t\tgotWeather() {\n\t\t\treturn this.address && !this.errorMessage\n\t\t},\n\t\taddRemoveFavoriteIcon() {\n\t\t\treturn this.currentAddressIsFavorite\n\t\t\t\t? IconStar\n\t\t\t\t: IconStarOutline\n\t\t},\n\t\taddRemoveFavoriteText() {\n\t\t\treturn this.currentAddressIsFavorite\n\t\t\t\t? t('weather_status', 'Remove from favorites')\n\t\t\t\t: t('weather_status', 'Add as favorite')\n\t\t},\n\t\tcurrentAddressIsFavorite() {\n\t\t\treturn this.favorites.find((f) => {\n\t\t\t\treturn f === this.address\n\t\t\t})\n\t\t},\n\t},\n\tmounted() {\n\t\tthis.initWeatherStatus()\n\t},\n\tmethods: {\n\t\tasync initWeatherStatus() {\n\t\t\ttry {\n\t\t\t\tconst loc = await network.getLocation()\n\t\t\t\tthis.lat = loc.lat\n\t\t\t\tthis.lon = loc.lon\n\t\t\t\tthis.address = loc.address\n\t\t\t\tthis.mode = loc.mode\n\n\t\t\t\tif (this.mode === MODE_BROWSER_LOCATION) {\n\t\t\t\t\tthis.askBrowserLocation()\n\t\t\t\t} else if (this.mode === MODE_MANUAL_LOCATION) {\n\t\t\t\t\tthis.startLoop()\n\t\t\t\t}\n\t\t\t\tconst favs = await network.getFavorites()\n\t\t\t\tthis.favorites = favs\n\t\t\t} catch (err) {\n\t\t\t\tif (err?.code === 'ECONNABORTED') {\n\t\t\t\t\tconsole.info('The weather status request was cancelled because the user navigates.')\n\t\t\t\t\treturn\n\t\t\t\t}\n\t\t\t\tif (err.response && err.response.status === 401) {\n\t\t\t\t\tshowError(t('weather_status', 'You are not logged in.'))\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('weather_status', 'There was an error getting the weather status information.'))\n\t\t\t\t}\n\t\t\t\tconsole.error(err)\n\t\t\t}\n\t\t},\n\t\tstartLoop() {\n\t\t\tclearInterval(this.loop)\n\t\t\tif (this.lat && this.lon) {\n\t\t\t\tthis.loop = setInterval(() => this.getForecast(), 60 * 1000 * 60)\n\t\t\t\tthis.getForecast()\n\t\t\t} else {\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t\taskBrowserLocation() {\n\t\t\tthis.loading = true\n\t\t\tthis.errorMessage = ''\n\t\t\tif (navigator.geolocation && window.isSecureContext) {\n\t\t\t\tnavigator.geolocation.getCurrentPosition((position) => {\n\t\t\t\t\tconsole.debug('browser location success')\n\t\t\t\t\tthis.lat = position.coords.latitude\n\t\t\t\t\tthis.lon = position.coords.longitude\n\t\t\t\t\tthis.saveMode(MODE_BROWSER_LOCATION)\n\t\t\t\t\tthis.mode = MODE_BROWSER_LOCATION\n\t\t\t\t\tthis.saveLocation(this.lat, this.lon)\n\t\t\t\t},\n\t\t\t\t(error) => {\n\t\t\t\t\tconsole.debug('location permission refused')\n\t\t\t\t\tconsole.debug(error)\n\t\t\t\t\tthis.saveMode(MODE_MANUAL_LOCATION)\n\t\t\t\t\tthis.mode = MODE_MANUAL_LOCATION\n\t\t\t\t\t// fallback on what we have if possible\n\t\t\t\t\tif (this.lat && this.lon) {\n\t\t\t\t\t\tthis.startLoop()\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.usePersonalAddress()\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t} else {\n\t\t\t\tconsole.debug('no secure context!')\n\t\t\t\tthis.saveMode(MODE_MANUAL_LOCATION)\n\t\t\t\tthis.mode = MODE_MANUAL_LOCATION\n\t\t\t\tthis.startLoop()\n\t\t\t}\n\t\t},\n\t\tasync getForecast() {\n\t\t\ttry {\n\t\t\t\tthis.forecasts = await network.fetchForecast()\n\t\t\t} catch (err) {\n\t\t\t\tthis.errorMessage = t('weather_status', 'No weather information found')\n\t\t\t\tconsole.debug(err)\n\t\t\t}\n\t\t\tthis.loading = false\n\t\t},\n\t\tasync setAddress(address) {\n\t\t\tthis.loading = true\n\t\t\tthis.errorMessage = ''\n\t\t\ttry {\n\t\t\t\tconst loc = await network.setAddress(address)\n\t\t\t\tif (loc.success) {\n\t\t\t\t\tthis.lat = loc.lat\n\t\t\t\t\tthis.lon = loc.lon\n\t\t\t\t\tthis.address = loc.address\n\t\t\t\t\tthis.mode = MODE_MANUAL_LOCATION\n\t\t\t\t\tthis.startLoop()\n\t\t\t\t} else {\n\t\t\t\t\tthis.errorMessage = t('weather_status', 'Location not found')\n\t\t\t\t\tthis.loading = false\n\t\t\t\t}\n\t\t\t} catch (err) {\n\t\t\t\tif (err.response && err.response.status === 401) {\n\t\t\t\t\tshowError(t('weather_status', 'You are not logged in.'))\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('weather_status', 'There was an error setting the location address.'))\n\t\t\t\t}\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t\tasync saveLocation(lat, lon) {\n\t\t\ttry {\n\t\t\t\tconst loc = await network.setLocation(lat, lon)\n\t\t\t\tthis.address = loc.address\n\t\t\t\tthis.startLoop()\n\t\t\t} catch (err) {\n\t\t\t\tif (err.response && err.response.status === 401) {\n\t\t\t\t\tshowError(t('weather_status', 'You are not logged in.'))\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('weather_status', 'There was an error setting the location.'))\n\t\t\t\t}\n\t\t\t\tconsole.debug(err)\n\t\t\t}\n\t\t},\n\t\tasync saveMode(mode) {\n\t\t\ttry {\n\t\t\t\tawait network.setMode(mode)\n\t\t\t} catch (err) {\n\t\t\t\tif (err.response && err.response.status === 401) {\n\t\t\t\t\tshowError(t('weather_status', 'You are not logged in.'))\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('weather_status', 'There was an error saving the mode.'))\n\t\t\t\t}\n\t\t\t\tconsole.debug(err)\n\t\t\t}\n\t\t},\n\t\tonBrowserLocationClick() {\n\t\t\tthis.askBrowserLocation()\n\t\t},\n\t\tasync usePersonalAddress() {\n\t\t\tthis.loading = true\n\t\t\ttry {\n\t\t\t\tconst loc = await network.usePersonalAddress()\n\t\t\t\tthis.lat = loc.lat\n\t\t\t\tthis.lon = loc.lon\n\t\t\t\tthis.address = loc.address\n\t\t\t\tthis.mode = MODE_MANUAL_LOCATION\n\t\t\t\tthis.startLoop()\n\t\t\t} catch (err) {\n\t\t\t\tif (err.response && err.response.status === 401) {\n\t\t\t\t\tshowError(t('weather_status', 'You are not logged in.'))\n\t\t\t\t} else {\n\t\t\t\t\tshowError(t('weather_status', 'There was an error using personal address.'))\n\t\t\t\t}\n\t\t\t\tconsole.debug(err)\n\t\t\t\tthis.loading = false\n\t\t\t}\n\t\t},\n\t\tonAddressSubmit() {\n\t\t\tconst newAddress = this.$refs.addressInput.$el.querySelector('input[type=\"text\"]').value\n\t\t\tthis.setAddress(newAddress)\n\t\t},\n\t\tgetLocalizedTemperature(celcius) {\n\t\t\treturn this.useFahrenheitLocale\n\t\t\t\t? (celcius * (9 / 5)) + 32\n\t\t\t\t: celcius\n\t\t},\n\t\tonAddRemoveFavoriteClick() {\n\t\t\tconst currentIsFavorite = this.currentAddressIsFavorite\n\t\t\tif (currentIsFavorite) {\n\t\t\t\tconst i = this.favorites.indexOf(currentIsFavorite)\n\t\t\t\tif (i !== -1) {\n\t\t\t\t\tthis.favorites.splice(i, 1)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tthis.favorites.push(this.address)\n\t\t\t}\n\t\t\tnetwork.saveFavorites(this.favorites)\n\t\t},\n\t\tonFavoriteClick(e, favAddress) {\n\t\t\t// clicked on the icon\n\t\t\tif (e.target.classList.contains('action-button__icon')) {\n\t\t\t\tconst i = this.favorites.indexOf(favAddress)\n\t\t\t\tif (i !== -1) {\n\t\t\t\t\tthis.favorites.splice(i, 1)\n\t\t\t\t}\n\t\t\t\tnetwork.saveFavorites(this.favorites)\n\t\t\t} else if (favAddress !== this.address) {\n\t\t\t\t// clicked on the text\n\t\t\t\tthis.setAddress(favAddress)\n\t\t\t}\n\t\t},\n\t\tformatTime(time) {\n\t\t\treturn moment(time).format('LT')\n\t\t},\n\t\tgetTemperature(forecasts, offset = 0) {\n\t\t\treturn forecasts.length > offset ? forecasts[offset].data.instant.details.air_temperature : ''\n\t\t},\n\t\tgetWeatherCode(forecasts, offset = 0) {\n\t\t\treturn forecasts.length > offset ? forecasts[offset].data.next_1_hours.summary.symbol_code : ''\n\t\t},\n\t\tgetWeatherIcon(weatherCode, loading) {\n\t\t\tif (loading) {\n\t\t\t\treturn 'icon-loading-small'\n\t\t\t} else {\n\t\t\t\treturn 'icon-weather ' + (weatherCode && weatherCode in weatherOptions\n\t\t\t\t\t? weatherOptions[weatherCode].icon\n\t\t\t\t\t: 'icon-fair-day')\n\t\t\t}\n\t\t},\n\t\tgetWeatherMessage(weatherCode, temperature, later = false) {\n\t\t\treturn weatherCode && weatherCode in weatherOptions\n\t\t\t\t? weatherOptions[weatherCode].text(\n\t\t\t\t\tMath.round(this.getLocalizedTemperature(temperature)),\n\t\t\t\t\tthis.temperatureUnit,\n\t\t\t\t\tlater,\n\t\t\t\t)\n\t\t\t\t: t('weather_status', 'Set location for weather')\n\t\t},\n\t},\n}\n</script>\n\n<style lang=\"scss\">\n.icon-weather {\n\tbackground-size: 16px;\n}\n.icon-weather-status {\n\tbackground-image: url('./../img/app-dark.svg');\n}\n.icon-clearsky-day {\n\tbackground-image: url('./../img/sun.svg');\n}\n.icon-clearsky-night {\n\tbackground-image: url('./../img/moon.svg');\n}\n.icon-cloudy {\n\tbackground-image: url('./../img/cloud-cloud.svg');\n}\n.icon-fair-day {\n\tbackground-image: url('./../img/sun-small-cloud.svg');\n}\n.icon-fair-night {\n\tbackground-image: url('./../img/moon-small-cloud.svg');\n}\n.icon-partlycloudy-day {\n\tbackground-image: url('./../img/sun-cloud.svg');\n}\n.icon-partlycloudy-night {\n\tbackground-image: url('./../img/moon-cloud.svg');\n}\n.icon-fog {\n\tbackground-image: url('./../img/fog.svg');\n}\n.icon-lightrain {\n\tbackground-image: url('./../img/light-rain.svg');\n}\n.icon-rain {\n\tbackground-image: url('./../img/rain.svg');\n}\n.icon-heavyrain {\n\tbackground-image: url('./../img/heavy-rain.svg');\n}\n.icon-light-rainshowers-day {\n\tbackground-image: url('./../img/sun-cloud-light-rain.svg');\n}\n.icon-light-rainshowers-night {\n\tbackground-image: url('./../img/moon-cloud-light-rain.svg');\n}\n.icon-rainshowers-day {\n\tbackground-image: url('./../img/sun-cloud-rain.svg');\n}\n.icon-rainshowers-night {\n\tbackground-image: url('./../img/moon-cloud-rain.svg');\n}\n.icon-heavy-rainshowers-day {\n\tbackground-image: url('./../img/sun-cloud-heavy-rain.svg');\n}\n.icon-heavy-rainshowers-night {\n\tbackground-image: url('./../img/moon-cloud-heavy-rain.svg');\n}\n.icon-crosshair {\n background-color: var(--color-main-text);\n padding: 0 !important;\n mask: url(./../img/cross.svg) no-repeat;\n mask-size: 18px 18px;\n mask-position: center;\n -webkit-mask: url(./../img/cross.svg) no-repeat;\n -webkit-mask-size: 18px 18px;\n -webkit-mask-position: center;\n min-width: 44px !important;\n min-height: 44px !important;\n}\n\n// Set color to primary element for current / active favorite address\n.favorite-color {\n\tcolor: var(--color-favorite);\n}\n\n.weather-status-menu-item__subheader {\n\twidth: 100%;\n\n\t.trigger > .icon {\n\t\tbackground-size: 16px;\n\t\tborder: 0;\n\t\tborder-radius: var(--border-radius-pill);\n\t\tfont-weight: normal;\n\t\tpadding-left: 40px;\n\n\t\t&.icon-loading-small {\n\t\t\t&::after {\n\t\t\t\tleft: 21px;\n\t\t\t}\n\t\t}\n\t}\n}\n</style>\n","/**\n * SPDX-FileCopyrightText: 2016 Nextcloud GmbH and Nextcloud contributors\n * SPDX-License-Identifier: AGPL-3.0-or-later\n */\n\nimport Vue from 'vue'\nimport App from './App.vue'\n\nVue.prototype.t = t\n\ndocument.addEventListener('DOMContentLoaded', function() {\n\tif (!OCA.Dashboard) {\n\t\treturn\n\t}\n\n\tOCA.Dashboard.registerStatus('weather', (el) => {\n\t\tconst Dashboard = Vue.extend(App)\n\t\treturn new Dashboard().$mount(el)\n\t})\n})\n"],"names":["setLocation","lat","lon","url","generateOcsUrl","HttpClient","setAddress","address","setMode","mode","usePersonalAddress","getLocation","fetchForecast","getFavorites","saveFavorites","favorites","MODE_BROWSER_LOCATION","MODE_MANUAL_LOCATION","weatherOptions","temperature","unit","later","_sfc_main","IconStar","NcActions","NcActionButton","NcActionCaption","NcActionInput","NcActionLink","NcActionSeparator","NcActionText","getLocale","IconStarOutline","f","loc","network.getLocation","favs","network.getFavorites","err","showError","position","error","network.fetchForecast","network.setAddress","network.setLocation","network.setMode","network.usePersonalAddress","newAddress","celcius","currentIsFavorite","i","network.saveFavorites","e","favAddress","time","moment","forecasts","offset","weatherCode","loading","Vue","el","Dashboard","App"],"mappings":"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"}
|