Compare commits

..

12 Commits

Author SHA1 Message Date
Thomas Rupprecht b48278bb17 0.8.1 2022-12-25 17:23:06 +01:00
Thomas Rupprecht 67382eadc0 fix copy-version script 2022-12-25 17:22:46 +01:00
Thomas Rupprecht 45c8deb007 cleanup data on startup 2022-12-25 17:18:58 +01:00
Thomas Rupprecht cbf21a24ad unfiy codestyle 2022-12-25 16:58:52 +01:00
Thomas Rupprecht de70d42b2b use browser.alarms api 2022-12-25 16:45:34 +01:00
Thomas Rupprecht 6b69d7cd6a use storage api 2022-12-25 02:56:18 +01:00
Thomas Rupprecht fc2ad7afad store data in localStorage 2022-12-25 02:33:24 +01:00
Thomas Rupprecht 4f717f7c80 update package-lock 2022-12-25 01:56:54 +01:00
Thomas Rupprecht a1cf58d8d3 move manifest and _locales into src 2022-12-25 01:52:02 +01:00
Thomas Rupprecht b41bf2b183 cursor pointer on clickable elements 2022-12-25 01:35:00 +01:00
Thomas Rupprecht c3cf1e9b96 faster data fetching, badge improvements 2022-12-25 01:26:20 +01:00
Thomas Rupprecht 489d675ba8 manifest l10n 2022-12-25 01:23:15 +01:00
9 changed files with 123 additions and 58 deletions

5
package-lock.json generated
View File

@ -1,12 +1,13 @@
{
"name": "usrspace-browser-addon",
"version": "0.8.0",
"version": "0.8.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "usrspace-browser-addon",
"version": "0.8.0",
"version": "0.8.1",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"webextension-polyfill": "^0.10.0"

View File

@ -1,7 +1,7 @@
{
"name": "usrspace-browser-addon",
"description": "WebExtension for the Hacker-/Maker-Space /usr/space",
"version": "0.8.0",
"version": "0.8.1",
"dependencies": {
"webextension-polyfill": "^0.10.0"
},
@ -10,8 +10,10 @@
},
"scripts": {
"copy-browser-polyfill": "cp node_modules/webextension-polyfill/dist/browser-polyfill.js src/browser-polyfill.js",
"copy-version": "sed -i 's/^\t\"version\": \".*\",$/\t\"version\": \"'$(rg '^\t\"version\": \"(.+)\",$' -r '$1' < package.json)'\",/' manifest.json",
"build": "web-ext build -o -n \"_usr_space-{version}.zip\" -i README.md package.json package-lock.json",
"copy-version": "sed -i 's/^\t\"version\": \".*\",$/\t\"version\": \"'$(rg '^\t\"version\": \"(.+)\",$' -r '$1' < package.json)'\",/' src/manifest.json",
"prebuild": "cp LICENSE.txt src/",
"build": "web-ext build -o -s src/ -n \"_usr_space-{version}.zip\"",
"postbuild": "rm src/LICENSE.txt",
"test": "echo \"Error: no test specified\" && exit 0",
"postinstall": "npm run copy-browser-polyfill",
"preversion": "npm test",

View File

@ -1,4 +1,13 @@
{
"extensionName": {
"message": "/usr/space"
},
"extensionDescription": {
"message": "WebExtension für den Hacker-/Maker-Space /usr/space"
},
"buttonTitle": {
"message": "/usr/space"
},
"loading": {
"message": "Lädt…"
},
@ -39,5 +48,14 @@
},
"closed": {
"message": "geschlossen"
},
"badgeOpen": {
"message": "open"
},
"badgeClosed": {
"message": ""
},
"badgeEvent": {
"message": ""
}
}

View File

@ -1,4 +1,13 @@
{
"extensionName": {
"message": "/usr/space"
},
"extensionDescription": {
"message": "WebExtension for the Hacker-/Maker-Space /usr/space"
},
"buttonTitle": {
"message": "/usr/space"
},
"loading": {
"message": "Loading…"
},
@ -39,5 +48,14 @@
},
"closed": {
"message": "closed"
},
"badgeOpen": {
"message": "open"
},
"badgeClosed": {
"message": ""
},
"badgeEvent": {
"message": ""
}
}

View File

@ -1,4 +1,4 @@
import Config from "./config.js";
import Config from './config.js';
/**
* @param {string} url
@ -11,7 +11,7 @@ async function fetchJson(url) {
/**
* @param {number} days
* @returns {Promise<object>}
* @returns {Promise<Array<object>>}
*/
function fetchCalendar(days = 28) {
let url = `${Config.calenderUrl}?o=json`;
@ -30,53 +30,71 @@ function fetchSpaceApi() {
async function fetchNewData() {
try {
const calendarJson = await fetchCalendar();
window.calendar = calendarJson;
} catch (error) {
console.error(error);
}
const result = await Promise.allSettled([fetchCalendar(), fetchSpaceApi()]);
const calendarJson = result[0].value;
const spaceApiJson = result[1].value;
try {
const spaceApiJson = await fetchSpaceApi();
if (spaceApiJson) {
const now = new Date();
const eventActive = calendarJson?.some((event) => (
new Date(event.begin) <= now && now <= new Date(event.end)
)) ?? false;
await browser.browserAction.setBadgeBackgroundColor({color: Config.openColor});
await browser.browserAction.setBadgeText({text: spaceApiJson.state.open ? 'open' : ''});
const badgeText = browser.i18n.getMessage(spaceApiJson.state.open ? 'badgeOpen' : eventActive ? 'badgeEvent' : 'badgeClosed');
const badgeBgColor = spaceApiJson.state.open ? Config.openColor : eventActive ? Config.eventColor : Config.closedColor;
await browser.browserAction.setBadgeText({text: badgeText});
await browser.browserAction.setBadgeBackgroundColor({color: badgeBgColor});
if (window.spaceApi && window.spaceApi.state.open !== spaceApiJson.state.open) {
const state = browser.i18n.getMessage(spaceApiJson.state.open ? 'open' : 'closed');
await browser.notifications.create('status-change', {
type: 'basic',
title: browser.i18n.getMessage('stateNotificationTitle'),
message: browser.i18n.getMessage('stateNotificationMessage', state),
iconUrl: browser.runtime.getURL('src/icons/favicon.svg')
});
const {spaceApi} = await browser.storage.local.get('spaceApi');
if (spaceApi && spaceApi.state.open !== spaceApiJson.state.open) {
const state = browser.i18n.getMessage(spaceApiJson.state.open ? 'open' : 'closed');
await browser.notifications.create('status-change', {
type: 'basic',
title: browser.i18n.getMessage('stateNotificationTitle'),
message: browser.i18n.getMessage('stateNotificationMessage', state),
iconUrl: browser.runtime.getURL('icons/favicon.svg'),
});
}
}
window.spaceApi = spaceApiJson;
await browser.storage.local.set({
calendar: calendarJson,
spaceApi: spaceApiJson,
});
} catch (error) {
console.error(error);
}
}
let intervalHandler = null;
browser.runtime.onStartup.addListener(async () => {
await browser.storage.local.remove(['calendar', 'spaceApi']);
});
function stopFetching() {
if (intervalHandler !== null) {
clearInterval(intervalHandler);
intervalHandler = null;
/**
* @param {Alarm} alarm
*/
function handleAlarm(alarm) {
if (alarm.name === 'fetchData') {
fetchNewData();
}
}
function startFetching() {
fetchNewData();
if (intervalHandler === null) {
intervalHandler = setInterval(() => {
fetchNewData();
}, Config.refreshTimeout);
}
browser.alarms.onAlarm.addListener(handleAlarm);
const now = new Date();
now.setMinutes(Math.ceil((now.getMinutes() + 1) / Config.refreshTimeout) * Config.refreshTimeout, 0, 0);
browser.alarms.create('fetchData', {
when: now.getTime(),
periodInMinutes: Config.refreshTimeout,
});
}
window.addEventListener('offline', () => {
stopFetching();
window.addEventListener('offline', async () => {
browser.alarms.onAlarm.removeListener(handleAlarm);
await browser.alarms.clear('fetchData');
});
window.addEventListener('online', () => {
startFetching();

View File

@ -1,8 +1,10 @@
export default {
refreshTimeout: 1000 * 60 * 5, // 5min,
refreshTimeout: 5,
spaceApiUrl: 'https://www.usrspace.at/spaceapi.json',
calenderUrl: 'https://www.usrspace.at/calendar.php',
openColor: '#33cc33',
closedColor: '#cc3333',
eventColor: '#9933cc',
quickLinks: [
{
url: 'https://www.usrspace.at/',

View File

@ -1,27 +1,29 @@
{
"manifest_version": 2,
"name": "/usr/space",
"version": "0.8.0",
"description": "WebExtension for the Hacker-/Maker-Space /usr/space",
"name": "__MSG_extensionName__",
"description": "__MSG_extensionDescription__",
"version": "0.8.1",
"icons": {
"48": "src/icons/favicon.svg",
"96": "src/icons/favicon.svg"
"48": "icons/favicon.svg",
"96": "icons/favicon.svg"
},
"background": {
"page": "src/background.html"
"page": "background.html"
},
"browser_action": {
"browser_style": true,
"default_title": "/usr/space",
"default_icon": "src/icons/favicon.svg",
"default_title": "__MSG_buttonTitle__",
"default_icon": "icons/favicon.svg",
"default_area": "navbar",
"default_popup": "src/popup.html"
"default_popup": "popup.html"
},
"default_locale": "de",
"permissions": [
"https://www.usrspace.at/*",
"webRequest",
"notifications"
"alarms",
"notifications",
"storage",
"webRequest"
],
"author": "Thomas Rupprecht",
"homepage_url": "https://gitea.usrspace.at/XimeX/usrspace-browser-addon",

View File

@ -50,6 +50,7 @@ h2 {
}
summary {
margin: 6px 12px 6px;
cursor: pointer;
}
summary > h2 {
margin: 0;
@ -70,6 +71,9 @@ svg {
width: 23px;
margin-right: 4px;
}
.link {
cursor: pointer;
}
#calendar > div > svg, #state > svg {
margin-right: 4px;

View File

@ -17,7 +17,7 @@ const doorOpenSVG = `
</svg>
`;
const dateTimeFormat = Intl.DateTimeFormat([], {dateStyle: "medium", timeStyle: "short"});
const dateTimeFormat = Intl.DateTimeFormat([], {dateStyle: 'medium', timeStyle: 'short'});
function setL10n() {
const loadingText = browser.i18n.getMessage('loading');
@ -49,20 +49,20 @@ async function init() {
linkElement.addEventListener('click', linkElementClickListener);
});
try {
const page = await browser.runtime.getBackgroundPage();
const {calendar, spaceApi} = await browser.storage.local.get(['calendar', 'spaceApi']);
updateNextEvent(page.calendar);
updateSpaceApiJson(page.spaceApi);
updateState(page.spaceApi);
} catch (error) {
console.error(error);
if (calendar) {
updateNextEvent(calendar);
}
if (spaceApi) {
updateSpaceApiJson(spaceApi);
updateState(spaceApi);
}
}
init();
/**
* @param {object} nextEvents
* @param {Array<object>} nextEvents
*/
function updateNextEvent(nextEvents) {
const calendarElement = document.getElementById('calendar');