// vim:set sw=4 ts=4 sts=4 ft=javascript expandtab:
import { lufi } from "/js/lufi.js";
const abortedDOM = document.createElement("div");
abortedDOM.innerHTML = `
${i18n.aborted1}
${i18n.aborted2}
`;
const loadingDOM = document.getElementById("loading");
const passwordDOM = document.getElementById("file_pwd");
const filesizeDOM = document.getElementById("filesize");
document.addEventListener("DOMContentLoaded", () => {
let go = true;
filesizeDOM.innerHTML = filesize(
filesizeDOM.attributes.getNamedItem("data-filesize").value,
{
base: 10,
}
);
if (isPasswordNeeded()) {
go = false;
passwordDOM.focus();
onPasswordEvents();
}
if (go) {
startDownload();
}
});
const isPasswordNeeded = () =>
document.querySelectorAll("#file_pwd").length === 1;
const startDownload = () => {
warnOnReload();
lufi
.download(window.location, passwordDOM?.value)
.andThen((job) => {
job.onProgress(() => {
updateProgress(job.lufiFile);
});
document.getElementById("abort").onclick = () => {
remove(["please-wait", "pbd", "loading", "abort"]);
job.terminate();
filesizeDOM.parentElement.append(abortedDOM);
warnOnReload(false);
document.getElementById("reloadLocation").onclick = (e) => {
e.preventDefault();
window.location.reload();
};
};
return job.waitForCompletion();
})
.mapErr((error) => {
addAlert(error.message);
warnOnReload(false);
remove(["abort"]);
})
.andThen((job) => {
notify(i18n.fileDownloaded, job.lufiFile.name);
remove(["please-wait", "loading"]);
const pbd = document.getElementById("pbd");
pbd.className = "center-align";
const blobURL = URL.createObjectURL(job.tmpFile);
let htmlContent = `${i18n.download}
`;
var isZip = filesizeDOM.getAttribute("data-zipped") === "true";
if (job.lufiFile.type.match(/^image\//) !== null) {
htmlContent += `
`;
} else if (job.lufiFile.type.match(/^video\//) !== null) {
htmlContent += ``;
} else if (job.lufiFile.type.match(/^audio\//) !== null) {
htmlContent += ``;
} else if (isZip) {
htmlContent += `${i18n.showZipContent}
`;
}
pbd.innerHTML = htmlContent;
if (isZip) {
showZipContent(job.tmpFile);
}
document.getElementById("abort").remove();
window.completed = true;
});
};
const remove = (elements) => {
elements.forEach((id) => {
if (document.getElementById(id)) {
document.getElementById(id).remove();
} else {
console.error(`${id} does not exist`);
}
});
};
const onPasswordEvents = () => {
const callback = () => {
document
.getElementsByClassName("file-progress")[0]
.classList.remove("hide");
document.getElementsByClassName("file-abort")[0].classList.remove("hide");
passwordDOM.parentElement.parentElement.classList.add("hide");
startDownload();
};
document.getElementById("go").onclick = () => {
callback();
};
document.getElementById("file_pwd").onkeydown = (event) => {
if (event.key === "Enter") {
callback();
}
};
};
// Something's wring
const addAlert = (msg) => {
// remove(["please-wait"]);
let pbd = document.getElementsByClassName("file-progress")[0];
pbd.setAttribute("role", "alert");
pbd.classList.remove("progress");
pbd.innerHTML = ``;
};
const warnOnReload = (toWarn = true) => {
if (toWarn) {
window.onbeforeunload = confirmExit;
} else {
window.onbeforeunload = null;
}
};
const updateProgress = (lufiFile) => {
// Update loading text
loadingDOM.textContent = i18n.loading.replace(/XX1/, lufiFile.chunksReady);
// Update progress bar
const percent =
Math.round((1000 * lufiFile.chunksReady) / lufiFile.totalChunks) / 10;
const wClass = percent.toString().replace(".", "-");
const pb = document.getElementById("pb");
pb.className = `determinate width-${wClass}`;
pb.attributes.getNamedItem("aria-valuenow").value = percent;
document.getElementById("pbt").innerHTML = `${percent}%`;
};
const showZipContent = (blob) => {
const showZipContentDOM = document.getElementById("showZipContent");
const showZipContentDOMListener = () => {
JSZip.loadAsync(blob).then((zip) => {
const newElement = document.createElement("div");
let innerHTML = `${i18n.zipContent}
`;
zip.forEach(function (_relativePath, zipEntry) {
innerHTML += `-
${escapeHtml(zipEntry.name)}
(${filesize(zipEntry._data.uncompressedSize, {
base: 10,
})})
`;
});
innerHTML += "
";
newElement.innerHTML = innerHTML;
pbd.append(newElement);
console.debug();
document.querySelectorAll(".download-zip-content").forEach((element) => {
const elementListener = (e) => {
e.preventDefault();
var filename = element.getAttribute("download");
zip.files[filename].async("blob").then((blob) => {
element.removeEventListener("click", elementListener);
element.setAttribute("href", URL.createObjectURL(blob));
element.click();
});
};
element.addEventListener("click", elementListener);
showZipContentDOM.style.display = "none";
showZipContentDOM.removeEventListener(
"click",
showZipContentDOMListener
);
});
});
};
showZipContentDOM.onclick = showZipContentDOMListener;
};