document.addEventListener('DOMContentLoaded', function() {
const dropzone = document.querySelector('.pdfu-dropzone');
const input = document.querySelector('#pdfu-file-input');
const queueList = document.querySelector('.pdfu-queue-list');
const gallery = document.querySelector('.pdfu-gallery');
if(window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.documentElement.setAttribute('data-theme', 'dark');
}
// Drag & Drop
dropzone.addEventListener('click', () => input.click());
dropzone.addEventListener('dragover', (e) => { e.preventDefault(); dropzone.classList.add('drag-over'); });
dropzone.addEventListener('dragleave', () => dropzone.classList.remove('drag-over'));
dropzone.addEventListener('drop', (e) => {
e.preventDefault();
dropzone.classList.remove('drag-over');
handleFiles(e.dataTransfer.files);
});
input.addEventListener('change', () => handleFiles(input.files));
function handleFiles(files) {
const fileArray = Array.from(files);
// Determine if this is a bulk upload
const isBulk = fileArray.length > 1;
fileArray.forEach(file => {
if (file.type !== 'application/pdf') return alert('PDF only!');
uploadFile(file, isBulk);
});
}
async function uploadFile(file, isBulk) {
// Create UI Card
const card = document.createElement('div');
card.className = 'pdfu-job-card';
card.innerHTML = `
${file.name}
Uploading...
`;
queueList.appendChild(card);
const formData = new FormData();
formData.append('file', file);
const formats = Array.from(document.querySelectorAll('input[name="pdfu_format"]:checked')).map(cb => cb.value);
formData.append('formats', JSON.stringify(formats.length ? formats : ['jpg']));
try {
const uploadRes = await fetch(pdfu_vars.root + 'pdfu/v1/upload', {
method: 'POST',
headers: { 'X-WP-Nonce': pdfu_vars.nonce },
body: formData
});
const data = await uploadRes.json();
if (data.success) {
processJob(data.job_id, card, isBulk);
} else {
card.querySelector('.pdfu-status-text').innerText = 'Upload Failed';
}
} catch (err) {
console.error(err);
card.querySelector('.pdfu-status-text').innerText = 'Error';
}
}
async function processJob(jobId, card, isBulk) {
let completed = false;
const cancelBtn = card.querySelector('.pdfu-cancel-btn');
const statusText = card.querySelector('.pdfu-status-text');
const actionsDiv = card.querySelector('.pdfu-actions');
let isCancelled = false;
cancelBtn.addEventListener('click', async () => {
isCancelled = true;
await fetch(pdfu_vars.root + 'pdfu/v1/cancel', {
method: 'POST',
headers: { 'X-WP-Nonce': pdfu_vars.nonce, 'Content-Type': 'application/json' },
body: JSON.stringify({ job_id: jobId })
});
card.remove();
});
while (!completed && !isCancelled) {
const res = await fetch(pdfu_vars.root + 'pdfu/v1/process', {
method: 'POST',
headers: { 'X-WP-Nonce': pdfu_vars.nonce, 'Content-Type': 'application/json' },
body: JSON.stringify({ job_id: jobId })
});
const statusData = await res.json();
if (statusData.status === 'processing') {
const bar = card.querySelector('.pdfu-bar');
bar.style.width = statusData.progress + '%';
statusText.innerText = `Processing page ${statusData.current_page}...`;
// Add preview images to gallery
if(statusData.images) {
statusData.images.forEach(img => {
const imgEl = document.createElement('img');
imgEl.src = img.url;
gallery.appendChild(imgEl);
});
}
} else if (statusData.status === 'completed') {
completed = true;
card.querySelector('.pdfu-bar').style.width = '100%';
statusText.innerText = 'Completed!';
// Remove Cancel Button
cancelBtn.remove();
// HANDLE DOWNLOADS
if (statusData.zip_url) {
if (isBulk) {
// Bulk Mode: Show Download Button
const downloadBtn = document.createElement('a');
downloadBtn.href = statusData.zip_url;
downloadBtn.className = 'button button-primary'; // WP Button style
downloadBtn.style.cssText = "text-decoration:none; padding: 5px 10px; background:#4F46E5; color:white; border-radius:4px;";
downloadBtn.innerText = 'Download ZIP';
actionsDiv.appendChild(downloadBtn);
} else {
// Single Mode: Auto Download
statusText.innerText = 'Downloading...';
const link = document.createElement('a');
link.href = statusData.zip_url;
link.setAttribute('download', '');
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
// Optional: Fade out card after auto-download
setTimeout(() => card.remove(), 4000);
}
}
} else if (statusData.status === 'failed') {
completed = true;
statusText.innerText = 'Failed: ' + (statusData.error || 'Unknown error');
card.style.border = '1px solid red';
}
}
}
});