const folderBtn = document.getElementById('folderBtn'); const zipBtn = document.getElementById('zipBtn'); const dropZone = document.getElementById('dropZone'); const output = document.getElementById('output'); const destinationInput = document.getElementById('destinationInput'); const browseDestinationBtn = document.getElementById('browseDestinationBtn'); const saveDestinationBtn = document.getElementById('saveDestinationBtn'); const destinationStatus = document.getElementById('destinationStatus'); const defaultDropZoneText = 'Trascina qui una cartella o un file .zip'; let isProcessing = false; function setLoading(isLoading) { folderBtn.disabled = isLoading; zipBtn.disabled = isLoading; } function setDestinationLoading(isLoading) { destinationInput.disabled = isLoading; browseDestinationBtn.disabled = isLoading; saveDestinationBtn.disabled = isLoading; } function renderResult(title, result) { const details = (result.details || []).slice(0, 20); const detailsText = details.length ? details .map((d) => (d.destination ? `- ${d.file} -> ${d.destination}` : `- ${d.file}: ${d.reason}`)) .join('\n') : '- nessun dettaglio'; output.textContent = [ title, `scansionati: ${result.scanned ?? 0}`, `copiati: ${result.copied ?? 0}`, `saltati: ${result.skipped ?? 0}`, '', 'dettagli (max 20):', detailsText, ].join('\n'); } async function handleAction(actionName, actionFn) { if (isProcessing) { return; } isProcessing = true; setLoading(true); output.textContent = `${actionName} in corso...`; try { const result = await actionFn(); if (!result || result.canceled) { output.textContent = `${actionName} annullato.`; return; } renderResult(actionName, result); } catch (error) { output.textContent = `${actionName} fallito:\n${error.message}`; } finally { setLoading(false); isProcessing = false; } } folderBtn.addEventListener('click', () => handleAction('Process Folder', window.api.selectFolder)); zipBtn.addEventListener('click', () => handleAction('Process ZIP', window.api.selectZip)); function resetDropZoneText() { dropZone.textContent = defaultDropZoneText; } function setDropZoneError(message) { dropZone.textContent = message; dropZone.classList.add('error'); setTimeout(() => { dropZone.classList.remove('error'); resetDropZoneText(); }, 1800); } dropZone.addEventListener('dragover', (event) => { event.preventDefault(); dropZone.classList.add('active'); }); dropZone.addEventListener('dragleave', () => { dropZone.classList.remove('active'); }); window.addEventListener('dragover', (event) => { event.preventDefault(); }); window.addEventListener('drop', (event) => { if (event.target instanceof Node && dropZone.contains(event.target)) { return; } event.preventDefault(); }); dropZone.addEventListener('drop', async (event) => { event.preventDefault(); dropZone.classList.remove('active'); const droppedFile = event.dataTransfer?.files?.[0] || event.dataTransfer?.items?.[0]?.getAsFile?.(); let droppedPath = ''; if (droppedFile) { try { droppedPath = window.api.getPathForDroppedFile(droppedFile) || droppedFile.path || ''; } catch { droppedPath = ''; } } if (!droppedPath) { setDropZoneError('Elemento non valido. Trascina una cartella o un file .zip'); return; } await handleAction('Process Drag & Drop', () => window.api.processDroppedPath(droppedPath)); }); browseDestinationBtn.addEventListener('click', async () => { try { setDestinationLoading(true); destinationStatus.textContent = 'Seleziona una cartella...'; const result = await window.api.selectDestinationFolder(); if (!result || result.canceled) { destinationStatus.textContent = 'Selezione annullata.'; return; } destinationInput.value = result.path; destinationStatus.textContent = 'Cartella selezionata. Premi Salva.'; } catch (error) { destinationStatus.textContent = `Errore: ${error.message}`; } finally { setDestinationLoading(false); } }); saveDestinationBtn.addEventListener('click', async () => { const destination = destinationInput.value.trim(); if (!destination) { destinationStatus.textContent = 'Inserisci una destinazione valida.'; return; } try { setDestinationLoading(true); destinationStatus.textContent = 'Salvataggio in corso...'; const result = await window.api.updateDestination(destination); destinationInput.value = result.destination; destinationStatus.textContent = 'Destinazione salvata.'; } catch (error) { destinationStatus.textContent = `Errore: ${error.message}`; } finally { setDestinationLoading(false); } }); async function initConfigUI() { try { const destinationResult = await window.api.getDestination(); destinationInput.value = destinationResult.destination || ''; destinationStatus.textContent = ''; } catch (error) { destinationStatus.textContent = 'Impossibile caricare la destinazione.'; } } initConfigUI();