async function startUpload() { if (!uploadsEnabled) { showToast("Guest uploads are disabled.", "warning"); return; } if (uploadLocked) { showToast("Upload already started. Press Clear to create another box.", "warning"); return; } if (!files.length) { showWarningDialog("No files selected", "There are no files selected. Please select files to upload."); showToast("No files selected. Please select files to upload.", "warning"); setStatus("No files selected"); return; } if (hasQuotaError()) { showWarningDialog("Over maximum upload size", quotaWarningMessage() || "Over maximum upload size."); showToast("Over maximum upload size.", "error"); return; } uploadLocked = true; setBoxOptionsLocked(true); if (el.fileInput) el.fileInput.disabled = true; el.dropzone?.classList.add("is-locked"); setShareUrl(""); files.forEach((item) => { item.loaded = 0; item.uploaded = false; item.failed = false; item.error = ""; }); completedImpactKeys = new Set(); overallImpactDone = false; renderFiles(); let completedCount = 0; const totalCount = files.length; const statusPrefix = () => `${completedCount}/${totalCount}`; setStatus(`${statusPrefix()} Uploading.`); animateUploadStatus(statusPrefix); try { const box = await createBox(); setShareUrl(box.box_url); files.forEach((item, index) => { item.boxID = box.box_id; item.boxFile = box.files[index]; item.displayName = item.boxFile?.name || item.displayName; const icon = item.row?.querySelector(".upload-file-icon"); if (icon && item.boxFile?.thumbnail_path) { item.row.classList.add("has-thumbnail"); icon.src = item.boxFile.thumbnail_path; } else if (icon && item.boxFile?.icon_path && !item.previewURL) { icon.src = item.boxFile.icon_path; } }); const results = await Promise.allSettled(files.map((item) => uploadFile(item, () => { completedCount += 1; }))); stopStatusAnimation(); const failedCount = results.filter((result) => result.status === "rejected").length; if (failedCount > 0) { setStatus(`${completedCount}/${totalCount} uploaded, ${failedCount} failed`); showToast(`${failedCount} file${failedCount === 1 ? "" : "s"} failed. The share URL contains the successful files.`, "error"); renderFiles(); return; } setOverallProgress(100); setStatus(`${completedCount}/${totalCount} uploaded. Share URL created. Press Clear to start another upload.`); showToast("Upload complete. Share URL created."); renderFiles(); } catch (error) { stopStatusAnimation(); uploadLocked = false; setBoxOptionsLocked(false); if (el.fileInput) el.fileInput.disabled = !uploadsEnabled; el.dropzone?.classList.remove("is-locked"); setShareUrl(""); setStatus(error.message || "Upload failed"); showToast(error.message || "Upload failed", "error"); renderFiles(); } }