lufi/themes/default/public/js/minified/files.min.js

192 lines
6.5 KiB
JavaScript

// themes/default/public/js/lib/utils.js
var formatDate = (unixTimestamp) => new Date(unixTimestamp * 1e3).toLocaleString(window.navigator.language, {
year: "numeric",
month: "long",
day: "numeric",
weekday: "long",
hour: "2-digit",
minute: "2-digit"
});
// themes/default/public/js/files.js
var addItem = (item) => {
const files = JSON.parse(localStorage.getItem(`${prefix}files`)) || [];
files.push(item);
localStorage.setItem(`${prefix}files`, JSON.stringify(files));
};
var deleteFromStorage = (serverKey) => {
let files = JSON.parse(localStorage.getItem(`${prefix}files`)) || [];
files = files.filter((file) => file.short !== serverKey);
localStorage.setItem(`${prefix}files`, JSON.stringify(files));
};
var itemExists = (serverKey) => {
const files = JSON.parse(localStorage.getItem(`${prefix}files`)) || [];
return files.some((file) => file.short === serverKey);
};
var updateSelection = (event) => {
document.querySelectorAll(".item .checkbox input").forEach((node) => {
node.checked = event.target.checked;
});
checkItemSelection();
};
var purgeExpired = () => {
const files = JSON.parse(localStorage.getItem(`${prefix}files`));
files.forEach((file) => {
const fileDOM = document.querySelector(`.item-${file.short}`);
if (fileDOM == null ? void 0 : fileDOM.classList.contains("deleted")) {
deleteFromStorage(file.short);
fileDOM.remove();
}
});
};
var exportStorage = () => {
const exportStorageDOM = document.getElementById("action-export-storage");
const storageData = [localStorage.getItem(`${prefix}files`)];
const exportFile = new Blob(storageData, { type: "application/json" });
exportStorageDOM.href = window.URL.createObjectURL(exportFile);
exportStorageDOM.download = "data.json";
};
var importStorage = (event) => {
const reader = new FileReader();
reader.addEventListener("loadend", () => {
try {
const newFiles = JSON.parse(
String.fromCharCode.apply(null, new Uint8Array(reader.result))
);
let importedCounter = 0;
newFiles.forEach((file) => {
if (validURL(file.url) && !itemExists(file.short)) {
addItem(file);
importedCounter++;
}
});
populateFilesTable();
} catch (err) {
alert(err);
}
});
reader.readAsArrayBuffer(event.target.files[0]);
};
var validURL = (str) => {
try {
return new URL(str).host ? true : false;
} catch (e) {
return false;
}
};
var deleteFile = (node) => {
const serverKey = node.dataset.serverKey;
const deleteUrl = new URL(
`${actionURL}d/${serverKey}/${node.dataset.actionKey}`
);
deleteUrl.searchParams.append("_format", "json");
fetch(deleteUrl, {
method: "GET"
}).then((response) => {
if (!response.ok) {
throw new Error("Network error while deleting file");
}
return response.json();
}).then((data) => {
if (data.success) {
node.remove();
deleteFromStorage(serverKey);
} else {
alert(data.msg);
}
checkItemSelection();
});
};
var checkItemSelection = () => {
const deleteSelectionDOM = document.getElementById("action-delete-selection");
if (document.querySelectorAll(".item .checkbox input:checked").length > 0) {
deleteSelectionDOM.disabled = false;
} else {
deleteSelectionDOM.disabled = true;
}
};
var deleteSelection = () => {
document.querySelectorAll(".item:has(.checkbox input:checked)").forEach((node) => deleteFile(node));
};
var populateFilesTable = () => {
const itemsTableDOM = document.getElementById("items-table");
itemsTableDOM.replaceChildren();
let files = localStorage.getItem(`${prefix}files`);
if (files === null) {
const filesWithoutPrefix = localStorage.getItem("files");
if (filesWithoutPrefix !== null) {
if (confirm(i18n.importFilesWithoutPrefix)) {
localStorage.setItem(`${prefix}files`, filesWithoutPrefix);
files = JSON.parse(filesWithoutPrefix);
} else {
localStorage.setItem(`${prefix}files`, JSON.stringify([]));
files = [];
}
} else {
files = [];
}
} else {
files = JSON.parse(files);
}
files.sort((a, b) => b.created_at - a.created_at);
files.forEach((file) => {
const itemDOM = document.querySelector("template#item").content.cloneNode(true).children[0];
itemDOM.classList.add(`item-${file.short}`);
itemDOM.dataset.serverKey = file.short;
itemDOM.dataset.actionKey = file.token;
itemDOM.querySelector(".name").innerText = file.name;
itemDOM.querySelector(".download a").href = file.url;
itemDOM.querySelector(".delete-at-first-view .icon").classList.add(file.del_at_first_view ? "fa-eraser" : "fa-close");
itemDOM.querySelector(".created-at").innerText = formatDate(
file.created_at
);
itemDOM.querySelector(".expires-at").innerText = file.delay == 0 ? i18n.noExpiration : formatDate(file.delay * 86400 + file.created_at);
itemDOM.querySelector(
".mail a"
).href = `${actionURL}m?links=["${file.short}"]`;
itemDOM.querySelector(".action-delete-item").onclick = () => deleteFile(itemDOM);
itemDOM.querySelector(".checkbox input").onclick = () => {
checkItemSelection();
};
itemsTableDOM.append(itemDOM);
console.debug(file.short, file.token);
fetch(counterURL, {
method: "POST",
headers: {
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
},
body: new URLSearchParams({
short: file.short,
token: file.token
})
}).then((response) => {
if (!response.ok) {
throw new Error(`Request error: ${response.statusText}`);
}
return response.json();
}).then((data) => {
const countDOM = itemDOM.querySelector(".counter");
if (data.success) {
countDOM.innerText = data.counter;
if (data.deleted) {
countDOM.parentElement.classList.add("deleted");
}
} else {
alert(data.msg);
countDOM.parentElement.remove();
if (data.missing) {
deleteFromStorage(data.short);
}
}
}).catch((error) => console.error(error));
});
};
document.addEventListener("DOMContentLoaded", () => {
populateFilesTable();
document.getElementById("action-select-all").onclick = updateSelection;
document.getElementById("action-export-storage").onclick = exportStorage;
document.getElementById("action-purge-expired").onclick = purgeExpired;
document.getElementById("action-import-storage").onchange = importStorage;
document.getElementById("action-delete-selection").onclick = deleteSelection;
});