jschan - Anonymous imageboard software. Classic look, modern features and feel. Works without JavaScript and supports Tor, I2P, Lokinet, etc.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

137 lines
3.8 KiB

/* globals __ __n LANG SERVER_TIMEZONE setLocalStorage */
let relativeTime = localStorage.getItem('relative') == 'true';
let hour24 = localStorage.getItem('24hour') == 'true';
let localTime = localStorage.getItem('localtime') == 'true';
let dates = [];
const dateElems = document.getElementsByClassName('reltime');
for (let i = 0; i < dateElems.length; i++) {
dates.push(dateElems[i]); //convert to array
}
const YEAR = 31536000000
, MONTH = 2592000000
, WEEK = 604800000
, DAY = 86400000
, HOUR = 3600000
, MINUTE = 60000;
const relativeTimeString = (date) => {
let difference = Date.now() - new Date(date).getTime();
let amount = 0;
let unit = '';
let isFuture = false;
if (difference < 0) {
difference = Math.abs(difference);
isFuture = true;
}
if (difference < MINUTE) {
return __('Now');
} else if (difference < MINUTE*59.5) {
amount = Math.round(difference / MINUTE);
unit = 'minute';
} else if (difference < HOUR*23.5) {
amount = Math.round(difference / HOUR);
unit = 'hour';
} else if (difference < DAY*6.5) {
amount = Math.round(difference / DAY);
unit = 'day';
} else if (difference < WEEK*3.5) {
amount = Math.round(difference / WEEK);
unit = 'week';
} else if (difference < MONTH*11.5) {
amount = Math.round(difference / MONTH);
unit = 'month';
} else {
amount = Math.round(difference / YEAR);
unit = 'year';
}
return __n(`%s ${unit} ${isFuture ? 'from now' : 'ago'}`, amount);
};
const changeDateFormat = (date) => {
const options = {
hour12: !hour24
};
if (!localTime) {
options.timeZone = SERVER_TIMEZONE;
}
const dateString = new Date(date.dateTime).toLocaleString(LANG, options);
if (relativeTime) {
date.innerText = relativeTimeString(date.dateTime);
date.title = dateString;
} else {
date.innerText = dateString;
date.removeAttribute('title');
}
};
const updateDates = () => {
for (let i = 0; i < dates.length; i++) {
changeDateFormat(dates[i]);
}
};
updateDates();
window.addEventListener('settingsReady', function() {
let relativeInterval = relativeTime ? setInterval(updateDates, MINUTE) : void 0;
const hour24Setting = document.getElementById('24hour-setting');
const togglehour24 = () => {
hour24 = !hour24;
setLocalStorage('24hour', hour24);
updateDates();
console.log('toggling 24h time', hour24);
};
hour24Setting.checked = hour24;
hour24Setting.addEventListener('change', togglehour24, false);
const localTimeSetting = document.getElementById('localtime-setting');
const toggleLocalTime = () => {
localTime = !localTime;
setLocalStorage('localtime', localTime);
updateDates();
console.log('toggling local time', localTime);
};
localTimeSetting.checked = localTime;
localTimeSetting.addEventListener('change', toggleLocalTime, false);
const relativeTimeSetting = document.getElementById('relative-setting');
const togglerelativeTime = () => {
relativeTime = !relativeTime;
setLocalStorage('relative', relativeTime);
updateDates();
if (relativeTime) {
relativeInterval = setInterval(updateDates, MINUTE);
} else {
clearInterval(relativeInterval);
}
console.log('toggling relative time', relativeTime);
};
relativeTimeSetting.checked = relativeTime;
relativeTimeSetting.addEventListener('change', togglerelativeTime, false);
});
const handleDateUpdates = (parentElem, temporary = false) => {
const newDateElems = parentElem.querySelectorAll('.reltime');
for (let date of newDateElems) {
if (!temporary) {
/* temporary e.g. floated posts, don't want to have their
date elements pushed/tracked in the dates array */
dates.push(date);
}
changeDateFormat(date);
}
};
window.addEventListener('addPost', function(e) {
handleDateUpdates(e.detail.post, e.detail.hover);
});
window.addEventListener('showModal', function(e) {
handleDateUpdates(e.detail.modal);
});