usrspace-browser-addon/src/popup.js

159 lines
5.1 KiB
JavaScript
Raw Permalink Normal View History

2023-01-06 02:02:50 +01:00
import { QUICK_LINKS } from './config.js';
// [INJECT-BROWSER-POLYFILL]
2023-02-04 17:09:47 +01:00
const dateTimeFormat = Intl.DateTimeFormat([], { dateStyle: 'medium', timeStyle: 'short' });
2022-12-24 02:31:56 +01:00
2022-12-24 21:23:31 +01:00
function setL10n() {
2023-01-04 23:21:40 +01:00
document.querySelector('html').setAttribute('lang', browser.i18n.getUILanguage());
2022-12-24 21:23:31 +01:00
const loadingText = browser.i18n.getMessage('loading');
document.getElementById('state').textContent = loadingText;
document.getElementById('calendar').textContent = loadingText;
document.querySelector('#space-api > code').textContent = loadingText;
document.getElementById('currentState').textContent = browser.i18n.getMessage('currentState');
document.getElementById('links').textContent = browser.i18n.getMessage('links');
document.getElementById('nextEvent').textContent = browser.i18n.getMessage('nextEvent');
document.getElementById('spaceApiJson').textContent = browser.i18n.getMessage('spaceApiJson');
}
2023-01-05 04:31:19 +01:00
function setLinks() {
const listElement = document.getElementById('link-list');
2023-01-06 02:02:50 +01:00
QUICK_LINKS.forEach((quickLink) => {
2023-01-05 04:31:19 +01:00
const template = getCleanTemplateById('template-link-item');
template.querySelector('.link').dataset.url = quickLink.url;
const svgIcon = getCleanTemplateById(quickLink.iconTemplateId);
svgIcon.querySelector('svg').setAttribute('aria-label', quickLink.text);
template.querySelector('.icon').append(svgIcon);
template.querySelector('.text').textContent = quickLink.text;
listElement.append(template);
});
}
2022-12-24 13:50:28 +01:00
/**
* @param {Event} event
*/
async function linkElementClickListener(event) {
try {
2023-02-04 17:09:47 +01:00
await browser.tabs.create({ url: event.currentTarget.dataset.url });
} catch (error) {
console.error(error);
}
}
async function init() {
2022-12-24 21:23:31 +01:00
setL10n();
2023-01-05 04:31:19 +01:00
setLinks();
2022-12-24 21:23:31 +01:00
const linkElements = Array.from(document.getElementsByClassName('link'));
linkElements.forEach((linkElement) => {
linkElement.addEventListener('click', linkElementClickListener);
2021-09-22 21:04:32 +02:00
});
2018-12-27 10:37:31 +01:00
/**
* @type {import("../types").Storage}
*/
2023-02-04 17:09:47 +01:00
const { calendar, spaceApi } = await browser.storage.local.get(['calendar', 'spaceApi']);
2022-12-25 02:33:24 +01:00
if (calendar) {
updateNextEvent(calendar);
}
if (spaceApi) {
updateSpaceApiJson(spaceApi);
updateState(spaceApi);
}
}
2023-01-21 03:39:41 +01:00
await init();
2018-12-27 10:37:31 +01:00
2022-12-24 13:50:28 +01:00
/**
* @param {import("../types").Calendar} nextEvents
2022-12-24 13:50:28 +01:00
*/
function updateNextEvent(nextEvents) {
2021-09-22 21:04:32 +02:00
const calendarElement = document.getElementById('calendar');
calendarElement.innerText = '';
2019-10-04 21:58:48 +02:00
2021-09-22 21:04:32 +02:00
if (nextEvents.length === 0) {
const strongElement = document.createElement('strong');
2022-12-24 21:23:31 +01:00
strongElement.textContent = browser.i18n.getMessage('noEventsInNext4Weeks');
2021-09-22 21:04:32 +02:00
calendarElement.append(strongElement);
2022-12-24 13:50:28 +01:00
} else {
const nextEventDate = nextEvents[0].begin.substring(0, 10);
2022-12-24 13:50:28 +01:00
const nextEventDateEvents = nextEvents.filter((nextEvent) => (nextEvent.begin.startsWith(nextEventDate)));
2020-04-20 19:29:10 +02:00
2022-12-24 13:50:28 +01:00
nextEventDateEvents.forEach((nextEventDateEvent) => {
2023-01-05 04:31:19 +01:00
const calendarEntryElement = getCleanTemplateById('template-calendar-entry');
2023-01-05 00:24:13 +01:00
2023-01-05 04:31:19 +01:00
calendarEntryElement.querySelector('svg').setAttribute('aria-label', browser.i18n.getMessage('event'));
2023-01-05 00:24:13 +01:00
2023-01-05 04:31:19 +01:00
calendarEntryElement.querySelector('strong').textContent = nextEventDateEvent.name;
2022-12-24 21:23:31 +01:00
2023-01-05 04:31:19 +01:00
const timeElement = calendarEntryElement.querySelector('time');
2022-12-24 21:23:31 +01:00
const beginDate = new Date(nextEventDateEvent.begin);
timeElement.dateTime = beginDate.toISOString();
timeElement.textContent = dateTimeFormat.format(beginDate);
2022-12-24 13:50:28 +01:00
if (nextEventDateEvent.location) {
2023-01-05 04:31:19 +01:00
const locationElement = getCleanTemplateById('template-calendar-entry-location');
2023-01-05 00:24:13 +01:00
2023-01-05 04:31:19 +01:00
locationElement.querySelector('address').textContent = nextEventDateEvent.location;
2023-01-05 00:24:13 +01:00
2023-01-05 04:31:19 +01:00
calendarEntryElement.querySelector('.calendar-entry > div').append(locationElement);
2022-12-24 13:50:28 +01:00
}
2023-01-05 04:31:19 +01:00
calendarElement.append(calendarEntryElement);
2022-12-24 13:50:28 +01:00
});
}
}
2018-12-27 10:37:31 +01:00
2022-12-24 13:50:28 +01:00
/**
* @param {import("../types").SpaceApi} spaceApi
2022-12-24 13:50:28 +01:00
*/
function updateSpaceApiJson(spaceApi) {
2022-12-24 21:23:31 +01:00
const spaceApiElement = document.querySelector('#space-api > code');
2023-01-05 14:29:15 +01:00
spaceApiElement.textContent = JSON.stringify(spaceApi, null, 2);
}
2022-12-24 13:50:28 +01:00
/**
* @param {import("../types").SpaceApi} spaceApi
2022-12-24 13:50:28 +01:00
*/
function updateState(spaceApi) {
2023-01-05 04:31:19 +01:00
const state = spaceApi.state.open ? 'open' : 'closed';
const stateElements = getCleanTemplateById('template-state');
const svgIconState = getCleanTemplateById(`template-icon-${state}`);
svgIconState.querySelector('svg').setAttribute('aria-label', browser.i18n.getMessage(state));
stateElements.querySelector('svg').replaceWith(svgIconState);
2022-12-24 21:23:31 +01:00
2023-01-05 04:31:19 +01:00
stateElements.querySelector('span').textContent = browser.i18n.getMessage(spaceApi.state.open ? 'openSince' : 'closedSince');
const timeElement = stateElements.querySelector('time');
2021-09-22 21:04:32 +02:00
const since = new Date(spaceApi.state.lastchange * 1000);
2022-12-24 21:23:31 +01:00
timeElement.dateTime = since.toISOString();
timeElement.textContent = dateTimeFormat.format(since);
const stateElement = document.getElementById('state');
2023-01-05 04:31:19 +01:00
stateElement.innerText = '';
stateElement.append(stateElements);
}
/**
* @param {string} templateId
* @returns {DocumentFragment}
*/
function getCleanTemplateById(templateId) {
const template = document.getElementById(templateId).content.cloneNode(true);
if (template.hasChildNodes()) {
for (const childNode of template.childNodes) {
if (childNode.nodeType !== Node.ELEMENT_NODE) {
template.removeChild(childNode);
}
}
}
return template;
}