Compare commits
12 Commits
Author | SHA1 | Date |
---|---|---|
Thomas Rupprecht | b48278bb17 | |
Thomas Rupprecht | 67382eadc0 | |
Thomas Rupprecht | 45c8deb007 | |
Thomas Rupprecht | cbf21a24ad | |
Thomas Rupprecht | de70d42b2b | |
Thomas Rupprecht | 6b69d7cd6a | |
Thomas Rupprecht | fc2ad7afad | |
Thomas Rupprecht | 4f717f7c80 | |
Thomas Rupprecht | a1cf58d8d3 | |
Thomas Rupprecht | b41bf2b183 | |
Thomas Rupprecht | c3cf1e9b96 | |
Thomas Rupprecht | 489d675ba8 |
|
@ -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"
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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": " "
|
||||
}
|
||||
}
|
|
@ -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": " "
|
||||
}
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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/',
|
||||
|
|
|
@ -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",
|
|
@ -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;
|
||||
|
|
18
src/popup.js
18
src/popup.js
|
@ -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');
|
||||
|
|
Loading…
Reference in New Issue