save-server
Version:
A powerful ShareX image and URL server, with support for multiple users.
175 lines (151 loc) • 4.71 kB
JavaScript
function parseDate(time) {
if (typeof time === "string") {
time = new Date(time);
}
function getClean(date) {
const diff = (((new Date()).getTime() - date.getTime()) / 1000);
const day_diff = Math.floor(diff / 86400);
if (isNaN(day_diff) || day_diff < 0 || day_diff >= 31) {
console.log("Bad date");
return;
}
return day_diff === 0 && (
diff < 60 && "just now" ||
diff < 120 && "1 minute ago" ||
diff < 3600 && Math.floor(diff / 60) + " minutes ago" ||
diff < 7200 && "1 hour ago" ||
diff < 86400 && Math.floor(diff / 3600) + " hours ago") ||
day_diff === 1 && "Yesterday" ||
day_diff < 7 && day_diff + " days ago" ||
day_diff < 31 && Math.ceil(day_diff / 7) + " weeks ago";
}
const timeString = getClean(time);
if (timeString) {
return timeString;
} else {
const day = time.getDate();
const month = time.getMonth() + 1;
const year = time.getFullYear();
const hour = time.getHours();
const minutes = time.getMinutes();
let minuteString = minutes + "";
if (minuteString.length === 1) {
minuteString = `0${minuteString}`;
}
return `${day}/${month}/${year} at ${hour}:${minuteString}`;
}
}
function deleteFile(fileInfo, cb) {
let str = fileInfo.id;
if (fileInfo.extension) str += fileInfo.extension;
const sure = confirm(`Are you sure you want to delete ${str}?`);
if (sure) {
// Delete the file
window.Api.delete(`/files/${fileInfo.id}`)
.then((res) => {
if (res.success) {
if (cb) cb(true);
} else {
showError(res.error);
if (cb) cb();
}
})
.catch(showError);
// Incase it's open.
} else {
if (cb) cb();
}
}
window.deleteFile = deleteFile;
function logout() {
window.Api.post("/users/@me/logout")
.then((res) => {
if (res.success) {
document.location.href = "/";
} else {
showError(res.error);
}
})
.catch(showError);
}
window.logout = logout;
// We create dynamically because it's easier than ensuring the HTML code exists on every page.
function showMessage(headerContent, content, colour, closeAfter, closeCb) {
if (closeAfter < 500) {
// Assume it's been provided in seconds.
closeAfter = closeAfter * 1000;
}
let parent = document.getElementById("message-parent");
if (!parent) {
parent = document.createElement("div");
parent.className = "fixed-message";
parent.id = "message-parent";
document.body.appendChild(parent);
}
const message = document.createElement("div");
message.className = `message is-${colour} slideInRight`;
const header = document.createElement("div");
header.className = "message-header";
const headerText = document.createElement("p");
headerText.innerText = headerContent;
header.appendChild(headerText);
const deleteButton = document.createElement("button");
deleteButton.className = "delete";
header.appendChild(deleteButton);
function close() {
if (message) {
message.classList.remove("slideInRight");
message.classList.add("slideOutRight");
setTimeout(function () {
message.remove();
}, 2000);
if (closeCb) closeCb();
}
}
deleteButton.onclick = close;
message.appendChild(header);
const messageBody = document.createElement("div");
messageBody.className = "message-body";
messageBody.innerText = content;
message.appendChild(messageBody);
parent.appendChild(message);
if (closeAfter) {
setTimeout(close, closeAfter);
}
return message;
}
function showError(error) {
if (error.error && error.error.status) {
error = error.error;
}
const errorText = `${error.status ? `${error.status}: ` : ""} Something went wrong`;
const content = typeof error === "string" ? error : error.message;
return showMessage(errorText, content, "danger");
}
function getCookie(name) {
const value = `; ${document.cookie}`;
const parts = value.split(`; ${name}=`);
if (parts.length === 2) return parts.pop().split(";").shift();
}
window.getCookie = getCookie;
document.addEventListener("DOMContentLoaded", () => {
// Get all "navbar-burger" elements
const $navbarBurgers = Array.prototype.slice.call(document.querySelectorAll(".navbar-burger"), 0);
// Check if there are any navbar burgers
if ($navbarBurgers.length > 0) {
// Add a click event on each of them
$navbarBurgers.forEach(el => {
el.addEventListener("click", () => {
// Get the target from the "data-target" attribute
const target = el.dataset.target;
const $target = document.getElementById(target);
// Toggle the "is-active" class on both the "navbar-burger" and the "navbar-menu"
el.classList.toggle("is-active");
$target.classList.toggle("is-active");
});
});
}
});
window.showMessage = showMessage;
window.showError = showError;
window.parseDate = parseDate;