engelsystem/resources/assets/js/countdown.js

81 lines
2.0 KiB
JavaScript

const lang = document.documentElement.getAttribute('lang');
const templateFuture = 'in %value %unit';
const templatePast = lang === 'en'
? '%value %unit ago'
: 'vor %value %unit';
const yearUnits = lang === 'en'
? ['year', 'years']
: ['Jahr', 'Jahren'];
const monthUnits = lang === 'en'
? ['month', 'months']
: ['Monat', 'Monaten'];
const dayUnits = lang === 'en'
? ['day', 'days']
: ['Tag', 'Tagen'];
const hourUnits = lang === 'en'
? ['hour', 'hours']
: ['Stunde', 'Stunden'];
const minuteUnits = lang === 'en'
? ['minute', 'minutes']
: ['Minute', 'Minuten'];
const secondUnits = lang === 'en'
? ['second', 'seconds']
: ['Sekunde', 'Sekunden'];
const nowString = lang === 'en' ? 'now' : 'jetzt';
const secondsHour = 60 * 60;
const timeFrames = [
[365 * 24 * 60 * 60, yearUnits],
[30 * 24 * 60 * 60, monthUnits],
[24 * 60 * 60, dayUnits],
[secondsHour, hourUnits],
[60, minuteUnits],
[1, secondUnits],
];
function formatFromNow(timestamp) {
const now = Date.now() / 1000;
const diff = Math.abs(timestamp - now);
const ago = now > timestamp;
for (const [duration, [singular, plural]] of timeFrames) {
const value = diff < secondsHour
? Math.floor(diff / duration)
: Math.round(diff / duration);
if (value) {
const template = ago ? templatePast : templateFuture;
const unit = value === 1 ? singular : plural;
return template
.replace('%value', value)
.replace('%unit', unit);
}
}
return nowString;
}
/**
* Initialises all countdown fields on the page.
*/
$(function () {
$.each($('[data-countdown-ts]'), function (i, e) {
const span = $(e);
const timestamp = span.data('countdown-ts');
const text = span.html();
span.html(text.replace('%c', formatFromNow(timestamp)));
setInterval(function () {
span.html(text.replace('%c', formatFromNow(timestamp)));
}, 1000);
});
});