smart-dropzone-react
Version:
🚀 A production-ready React dropzone component with smart defaults, drag & drop reordering, chunked uploads, resume functionality, and comprehensive provider support (Cloudinary, AWS S3, Supabase)
2 lines • 3.55 kB
JavaScript
var chunkYZAKDUU2_cjs=require('./chunk-YZAKDUU2.cjs'),react=require('react');function J(c,p={}){let[t,u]=react.useState([]),[F,w]=react.useState(false),[O,i]=react.useState(null),[A,f]=react.useState({}),U=react.useMemo(()=>new chunkYZAKDUU2_cjs.a(p),[p.maxFiles,p.maxFileSize,p.allowedTypes]);react.useEffect(()=>((async()=>{try{await c.initialize();}catch(r){i(`Failed to initialize ${c.getName()} provider: ${r instanceof Error?r.message:"Unknown error"}`);}})(),()=>{c.cleanup().catch(console.warn);}),[c]);let S=react.useCallback(async s=>{try{i(null);let r=await U.processFiles(s);if(r.success&&r.files)return u(e=>[...e,...r.files]),{success:!0,files:r.files};if(r.errors){let e=r.errors.join("; ");return i(e),{success:!1,errors:r.errors}}}catch(r){let e=r instanceof Error?r.message:"Failed to process files";return i(e),{success:false,errors:[e]}}},[U]),M=react.useCallback(s=>{u(r=>r.filter(e=>e.id!==s)),f(r=>{let e={...r};return delete e[s],e});},[]),b=react.useCallback(()=>{u([]),f({}),i(null);},[]),y=react.useCallback(async(s,r)=>{let e=t.find(n=>n.id===s);if(!(!e||e.status==="success"))try{i(null),f(o=>({...o,[s]:0})),u(o=>o.map(a=>a.id===s?{...a,status:"uploading"}:a));let n={...p,...r},l=await c.uploadFile(e.file,n);return u(o=>o.map(a=>a.id===s?{...a,status:"success",progress:100,publicId:l.id,url:l.url,uploadedAt:l.createdAt}:a)),f(o=>({...o,[s]:100})),l}catch(n){let l=n instanceof Error?n.message:"Upload failed";throw i(l),u(o=>o.map(a=>a.id===s?{...a,status:"error",error:l}:a)),n}},[t,c,p]),x=react.useCallback(async s=>{if(t.length===0||F)return;let r=t.filter(e=>e.status==="pending");if(r.length!==0){w(true),i(null);try{let e={...p,...s},n=await c.uploadFiles(r.map(l=>l.file),e,(l,o)=>{f(a=>({...a,[l]:o}));});return u(l=>l.map(o=>{let a=n.find(B=>B.filename===o.name);return a&&o.status==="pending"?{...o,status:"success",progress:100,publicId:a.id,url:a.url,uploadedAt:a.createdAt}:o})),n}catch(e){let n=e instanceof Error?e.message:"Upload failed";throw i(n),u(l=>l.map(o=>o.status==="uploading"?{...o,status:"error",error:n}:o)),e}finally{w(false);}}},[t,F,c,p]),C=react.useCallback(async(s,r)=>{let e=t.find(n=>n.id===s);if(!(!e||e.status!=="error"))try{return i(null),await y(s,r)}catch(n){throw n}},[t,y]),$=react.useCallback(async s=>{let r=t.find(e=>e.id===s);if(!(!r||r.status!=="uploading"))try{u(e=>e.map(n=>n.id===s?{...n,status:"cancelled"}:n)),f(e=>{let n={...e};return delete n[s],n});}catch{}},[t]),k=react.useCallback(async()=>{try{return await c.getStats()}catch{return null}},[c]),j=react.useCallback(async()=>{try{return await c.testConnection()}catch{return false}},[c]),P=react.useMemo(()=>t.filter(s=>s.status==="pending"),[t]),N=react.useMemo(()=>t.filter(s=>s.status==="uploading"),[t]),h=react.useMemo(()=>t.filter(s=>s.status==="success"),[t]),z=react.useMemo(()=>t.filter(s=>s.status==="error"),[t]),R=react.useMemo(()=>t.filter(s=>s.status==="cancelled"),[t]),T=react.useMemo(()=>t.reduce((s,r)=>s+r.size,0),[t]),q=react.useMemo(()=>h.reduce((s,r)=>s+r.size,0),[h]);return {files:t,isUploading:F,error:O,uploadProgress:A,pendingFiles:P,uploadingFiles:N,successFiles:h,errorFiles:z,cancelledFiles:R,totalSize:T,uploadedSize:q,addFiles:S,removeFile:M,clearAll:b,uploadFile:y,uploadAll:x,retryUpload:C,cancelUpload:$,getStats:k,testConnection:j,hasFiles:t.length>0,hasPendingFiles:P.length>0,hasErrors:z.length>0,isFullyUploaded:t.length>0&&t.every(s=>s.status==="success")}}exports.a=J;//# sourceMappingURL=chunk-4NMULKNG.cjs.map
//# sourceMappingURL=chunk-4NMULKNG.cjs.map
;