Files
loot-hunt/public/js/timeago.js
Mike Johnston 34b3a4cbd0
All checks were successful
Build Images and Deploy / Update-PROD-Stack (push) Successful in 31s
allow for a starting date and hidden hunt if it hasnt started
2026-03-19 14:39:06 -04:00

43 lines
1.5 KiB
JavaScript

// Relative timestamp ("time ago") for <time> elements
(function () {
function timeAgo(date) {
const now = new Date();
const diff = now - date;
const seconds = Math.floor(Math.abs(diff) / 1000);
const isFuture = diff < 0;
const prefix = isFuture ? 'in ' : '';
const suffix = isFuture ? '' : ' ago';
if (seconds < 5) return isFuture ? 'in a moment' : 'just now';
if (seconds < 60) return prefix + seconds + 's' + suffix;
const minutes = Math.floor(seconds / 60);
if (minutes < 60) return prefix + minutes + 'm' + suffix;
const hours = Math.floor(minutes / 60);
if (hours < 24) return prefix + hours + 'h' + suffix;
const days = Math.floor(hours / 24);
if (days < 7) return prefix + days + 'd' + suffix;
if (days < 30) return prefix + Math.floor(days / 7) + 'w' + suffix;
if (days < 365) return prefix + Math.floor(days / 30) + 'mo' + suffix;
return prefix + Math.floor(days / 365) + 'y' + suffix;
}
function updateTimes() {
document.querySelectorAll('time[datetime]').forEach(function (el) {
var raw = el.getAttribute('datetime');
// SQLite stores UTC dates without a 'Z' suffix — add it so the browser
// parses them as UTC instead of local time
if (raw && !/[Z+\-]\d{0,4}$/i.test(raw)) {
raw = raw.replace(' ', 'T') + 'Z';
}
var d = new Date(raw);
if (!isNaN(d)) {
el.textContent = timeAgo(d);
el.title = d.toLocaleString();
}
});
}
updateTimes();
setInterval(updateTimes, 30000); // refresh every 30s
})();