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