UNPKG

@fewings/react

Version:
2 lines (1 loc) 2.75 kB
var u=["B","KB","MB","GB","TB","PB","EB","ZB","YB"];import{useEffect as h,useRef as w,useState as y}from"react";function d(n,e){n.type="file",n.accept=e?.accept?Array.isArray(e.accept)?e?.accept.join(","):e.accept:"",n.multiple=e?.multiple??!0}function v(n){return(e,t=0)=>{let i=n,o=u.indexOf(e);for(let l=0;l<o;l++)i/=1024;return`${i.toFixed(t)}${e}`}}function F(n){let e=[];for(let t of n)e.push({origin:t,toUnit:v(t.size)});return e}async function T(n,e){if(e?.multiple===!1&&n.length>1)throw new Error("Multiple files are not allowed");if(e?.maxFiles&&n.length>e?.maxFiles)throw new Error(`Number of files(${n.length}) exceeds the limit: ${e?.maxFiles}`);for(let t of n){if(e?.accept&&!E(t.type,e.accept))throw new Error(`File type(${t.type}) is not allowed: ${e.accept}`);if(e?.maxBytes&&t.size>e.maxBytes)throw new Error(`File size(${t.size}bytes) exceeds the limit: ${e.maxBytes}bytes`);if(e?.customValidator){let i=e.customValidator(t);if(i instanceof Promise){if(!await i)throw new Error(`Custom validation failed: ${t.name}`)}else if(!i)throw new Error(`Custom validation failed: ${t.name}`)}}}function E(n,e){let t=(typeof e=="string"?e.split(","):e).map(o=>o.trim().replace(/\./g,"")),i=n.split("/")[1];return t.includes(n)||t.includes(n.split("/")[0]+"/*")||t.includes(i)}function B(n,e){let t=u.indexOf(e),i=n;for(let o=0;o<t;o++)i*=1024;return i}async function R(n){let e=new Audio,t=URL.createObjectURL(n);return e.src=t,new Promise((i,o)=>{e.onloadedmetadata=()=>{i(e.duration),URL.revokeObjectURL(t),e.remove()},e.onerror=l=>{o(l),URL.revokeObjectURL(t),e.remove()}})}function k({onChange:n,onError:e,...t}){let i=w(null),[o,l]=y(!1);h(()=>{let r=document.createElement("input");r.type="file",i.current=r},[]);let x=()=>{let r=i.current;if(!r)throw new Error("input element is not created.");return d(r,t),r},f=async r=>{if(r.length===0)throw new Error("No files selected");return await T(r,t),F(r)},p=()=>{let r=x();return new Promise((a,c)=>{r.onchange=async g=>{try{let s=g.target.files;if(!s)return c("No files selected");let m=await f(s);a(m),n?.(m)}catch(s){c(s),s instanceof Error&&e?.(s)}finally{r.onchange=null}},r.click()})};return{select:p,register:()=>({onDragOver:r=>{r.preventDefault(),l(!0)},onDragEnter:r=>{r.preventDefault(),l(!0)},onDragLeave:r=>{r.preventDefault(),l(!1)},onDrop:async r=>{r.preventDefault(),l(!1);try{let a=r.dataTransfer.files;if(!a||a.length===0)throw new Error("No files selected");let c=await f(a);n?.(c)}catch(a){a instanceof Error&&e?.(a)}},onClick:r=>{r.preventDefault(),p()}}),inputRef:i,isDragOver:o}}export{u as FILE_UNITS,F as convertFilesWithMeta,B as convertToBytes,R as getFileDuration,v as getUnitFunc,d as setUpOptions,k as useHandleFile,T as validateOptions,E as verifyAccept};