ArticleTemplates/assets/js/modules/relativeDates.js (80 lines of code) (raw):
function isToday(date) {
const today = new Date();
return (date.toDateString() === today.toDateString());
}
function isWithin24Hours(date) {
const today = new Date();
return (date.valueOf() > (today.valueOf() - (24 * 60 * 60 * 1000)));
}
function isWithinPastWeek(date) {
const daysAgo = new Date().valueOf() - (7 * 24 * 60 * 60 * 1000);
return date.valueOf() >= daysAgo;
}
function isWithinPastYear(date) {
const weeksAgo = new Date().valueOf() - (52 * 7 * 24 * 60 * 60 * 1000);
return date.valueOf() >= weeksAgo;
}
function isValidDate(date) {
if (Object.prototype.toString.call(date) !== '[object Date]') {
return false;
}
return !isNaN(date.getTime());
}
function makeRelativeDate(epoch) {
const then = new Date(Number(epoch));
const now = new Date();
let delta;
if (!isValidDate(then)) {
return false;
}
delta = parseInt((now.getTime() - then) / 1000, 10);
if (delta < 0) {
return false;
} else if (delta < 55) {
return `${delta}s`;
} else if (delta < (55 * 60)) {
const minutesAgo = Math.round(delta / 60, 10);
if (minutesAgo === 1) {
return 'Now';
} else {
return `${minutesAgo}m ago`;
}
} else if (isToday(then) || isWithin24Hours(then)) {
const hoursAgo = Math.round(delta / 3600);
return `${hoursAgo}h ago`;
} else if (isWithinPastWeek(then)) {
const daysAgo = Math.round(delta / 3600 / 24);
return `${daysAgo}d ago`;
} else if (isWithinPastYear(then)) {
const weeksAgo = Math.round(delta / 3600 / 24 / 7);
return `${weeksAgo}w ago`;
} else {
const yearsAgo = Math.round(delta / 3600 / 24 / 7 / 52);
return `${yearsAgo}y ago`;
}
}
function replaceValidTimestamps(selector, attr) {
let datetime;
let elem;
let elems;
let i;
let relativeDate;
let targetEl;
elems = document.querySelectorAll(`${selector}[${attr}]`);
for (i = 0; i < elems.length; i++) {
elem = elems[i];
datetime = new Date(elem.getAttribute(attr));
relativeDate = makeRelativeDate(datetime.getTime());
if (relativeDate) {
targetEl = elem.getElementsByClassName('timestamp__text')[0] || elem;
if (!targetEl.getAttribute('title')) {
targetEl.setAttribute('title', targetEl.innerText);
}
targetEl.innerHTML = relativeDate;
}
}
}
function init(selector, attr) {
replaceValidTimestamps(selector, attr);
}
export { init };