119 lines
5.1 KiB
JavaScript
119 lines
5.1 KiB
JavaScript
if (localStorage.getItem("loaded")) {
|
|
document.getElementById("mirrorLogo").className = "fa-solid fa-circle-dot fa-2xs";
|
|
document.getElementById("mirrorText").textContent = "drive.fybe.dev";
|
|
document.getElementById("mirrorLogo").style.color = "#47cc00";
|
|
} else {
|
|
setTimeout(() => {
|
|
document.getElementById("mirrorLogo").style.color = "#47cc00";
|
|
document.getElementById("mirrorText").textContent = "drive.fybe.dev";
|
|
setTimeout(() => {
|
|
document.getElementById("mirrorLogo").className = "fa-solid fa-circle-dot fa-2xs";
|
|
localStorage.setItem("loaded", true);
|
|
}, 3000);
|
|
}, 3000);
|
|
}
|
|
|
|
document.addEventListener('DOMContentLoaded', function() {
|
|
const form = document.getElementById('uploadForm');
|
|
if (!form) return;
|
|
|
|
const fileInput = document.getElementById('fileUpload');
|
|
const progress = document.getElementById('uploadProgress');
|
|
const progressText = document.getElementById('uploadProgressText');
|
|
const uploadBtn = document.getElementById('uploadBtn');
|
|
|
|
form.addEventListener('submit', function(e) {
|
|
e.preventDefault();
|
|
if (!fileInput || !fileInput.files || fileInput.files.length === 0) {
|
|
return;
|
|
}
|
|
|
|
const file = fileInput.files[0];
|
|
const formData = new FormData();
|
|
formData.append('file', file);
|
|
// include reusable checkbox if present
|
|
const reusable = form.querySelector('input[name="reusable"]');
|
|
if (reusable && reusable.checked) formData.append('reusable', 'on');
|
|
|
|
const xhr = new XMLHttpRequest();
|
|
xhr.open('POST', form.getAttribute('action'));
|
|
|
|
xhr.upload.addEventListener('progress', function(ev) {
|
|
if (ev.lengthComputable) {
|
|
const percent = Math.round((ev.loaded / ev.total) * 100);
|
|
if (progress) {
|
|
progress.style.display = 'block';
|
|
progress.value = percent;
|
|
}
|
|
if (progressText) {
|
|
progressText.style.display = 'block';
|
|
progressText.textContent = percent + '%';
|
|
}
|
|
if (uploadBtn) {
|
|
uploadBtn.classList.add('yellowBtn');
|
|
uploadBtn.value = '· · ·';
|
|
uploadBtn.disabled = true;
|
|
}
|
|
}
|
|
});
|
|
|
|
xhr.addEventListener('load', function() {
|
|
if (xhr.status >= 200 && xhr.status < 400) {
|
|
// Try to extract flash messages from the returned HTML and inject them
|
|
try {
|
|
const tmp = document.createElement('div');
|
|
tmp.innerHTML = xhr.responseText;
|
|
const newFlashes = tmp.querySelector('ul.flashes');
|
|
const oldFlashes = document.querySelector('ul.flashes');
|
|
if (newFlashes) {
|
|
if (oldFlashes) oldFlashes.replaceWith(newFlashes);
|
|
else document.body.insertBefore(newFlashes, document.body.firstChild);
|
|
} else {
|
|
// fallback to full reload if no flashes present
|
|
window.location.href = '/upload';
|
|
return;
|
|
}
|
|
} catch (e) {
|
|
window.location.href = '/upload';
|
|
return;
|
|
} finally {
|
|
if (uploadBtn) {
|
|
uploadBtn.disabled = false;
|
|
uploadBtn.classList.remove('yellowBtn');
|
|
uploadBtn.value = 'Upload';
|
|
}
|
|
if (progress) { progress.style.display = 'none'; progress.value = 0; }
|
|
if (progressText) { progressText.style.display = 'none'; progressText.textContent = '0%'; }
|
|
// clear file input and reusable checkbox after successful upload
|
|
if (fileInput) fileInput.value = '';
|
|
if (reusable && reusable.checked) reusable.checked = false;
|
|
}
|
|
} else {
|
|
// error
|
|
if (progressText) progressText.textContent = 'Upload failed';
|
|
if (uploadBtn) {
|
|
uploadBtn.disabled = false;
|
|
uploadBtn.classList.remove('yellowBtn');
|
|
uploadBtn.value = 'Upload';
|
|
}
|
|
if (fileInput) fileInput.value = '';
|
|
if (progress) { progress.style.display = 'none'; progress.value = 0; }
|
|
if (progressText) progressText.style.display = 'none';
|
|
}
|
|
});
|
|
|
|
xhr.addEventListener('error', function() {
|
|
if (progressText) progressText.textContent = 'Upload error';
|
|
if (uploadBtn) {
|
|
uploadBtn.disabled = false;
|
|
uploadBtn.classList.remove('yellowBtn');
|
|
uploadBtn.value = 'Upload';
|
|
}
|
|
if (fileInput) fileInput.value = '';
|
|
if (progress) { progress.style.display = 'none'; progress.value = 0; }
|
|
if (progressText) progressText.style.display = 'none';
|
|
});
|
|
|
|
xhr.send(formData);
|
|
});
|
|
}); |