@lifesg/web-frontend-engine 1.19.14 → 1.19.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (23) hide show
  1. package/chunks/{file-upload-manager.88131e38.js → file-upload-manager.1786802e.js} +2 -2
  2. package/chunks/{file-upload-manager.88131e38.js.map → file-upload-manager.1786802e.js.map} +1 -1
  3. package/chunks/{index.5a6b29eb.js → index.54c2add7.js} +2 -2
  4. package/chunks/{index.5a6b29eb.js.map → index.54c2add7.js.map} +1 -1
  5. package/chunks/{index.fc8f504e.js → index.a88ac40b.js} +5 -5
  6. package/chunks/{index.fc8f504e.js.map → index.a88ac40b.js.map} +1 -1
  7. package/chunks/{index.4b4ecdb7.js → index.b9888bc5.js} +2 -2
  8. package/chunks/{index.4b4ecdb7.js.map → index.b9888bc5.js.map} +1 -1
  9. package/chunks/{location-modal.ddb76a07.js → location-modal.53039680.js} +2 -2
  10. package/chunks/{location-modal.ddb76a07.js.map → location-modal.53039680.js.map} +1 -1
  11. package/cjs/chunks/{file-upload-manager.981ed57b.js → file-upload-manager.8b3a773b.js} +2 -2
  12. package/cjs/chunks/{file-upload-manager.981ed57b.js.map → file-upload-manager.8b3a773b.js.map} +1 -1
  13. package/cjs/chunks/{index.e35c6aea.js → index.b063ce55.js} +5 -5
  14. package/cjs/chunks/{index.e35c6aea.js.map → index.b063ce55.js.map} +1 -1
  15. package/cjs/chunks/{index.aa390365.js → index.ca424cf5.js} +2 -2
  16. package/cjs/chunks/{index.aa390365.js.map → index.ca424cf5.js.map} +1 -1
  17. package/cjs/chunks/{index.71a851b1.js → index.d42f693a.js} +2 -2
  18. package/cjs/chunks/{index.71a851b1.js.map → index.d42f693a.js.map} +1 -1
  19. package/cjs/chunks/{location-modal.d4929e93.js → location-modal.f9df87bc.js} +2 -2
  20. package/cjs/chunks/{location-modal.d4929e93.js.map → location-modal.f9df87bc.js.map} +1 -1
  21. package/cjs/index.js +1 -1
  22. package/index.js +1 -1
  23. package/package.json +3 -3
@@ -1,2 +1,2 @@
1
- import{useContext as e,useRef as t,useEffect as i}from"react";import{F as s,u as a,a as r,b as l,g as o,E as n,c as m,d as p,A as c,I as d}from"./index.fc8f504e.js";import"react/jsx-runtime";import"@lifesg/react-design-system/text";import"@lifesg/react-design-system/markup";import"react-dom/server";import"@lifesg/react-design-system/media";import"@lifesg/react-design-system/color";import"styled-components";import"@lifesg/react-design-system/button";import"@lifesg/react-design-system/modal";import"@lifesg/react-design-system/alert";import"@lifesg/react-design-system/layout";import"@lifesg/react-design-system/box-container";import"@lifesg/react-design-system/divider";import"@lifesg/react-design-system/text-list";import"@lifesg/react-design-system/popover-v2";import"@lifesg/react-icons";import"@lifesg/react-design-system/tab";import"@lifesg/react-icons/plus-circle-fill";import"@lifesg/react-design-system/button-with-icon";import"@lifesg/react-design-system/error-display";import"@lifesg/react-design-system/filter";import"@lifesg/react-design-system/uneditable-section";import"@lifesg/react-design-system/timeline";import"@lifesg/react-design-system/form";import"@lifesg/react-design-system/toggle";import"@lifesg/react-design-system/checkbox";import"@lifesg/react-design-system/file-upload";import"@lifesg/react-icons/cross";import"@lifesg/react-design-system/icon-button";import"@lifesg/react-icons/bin";import"@lifesg/react-icons/eraser";import"@lifesg/react-icons/pencil";import"@lifesg/react-icons/pencil-stroke";import"@lifesg/react-design-system";import"@lifesg/react-icons/plus";import"@lifesg/react-icons/exclamation-triangle";import"@lifesg/react-icons/pin-fill";import"@lifesg/react-design-system/design-token";import"@lifesg/react-design-system/image-button";import"@lifesg/react-design-system/radio-button";const f=["image/jpeg","image/gif","image/png"],g=g=>{const{compressImages:u,fileTypeRule:y,id:I,maxFileSizeRule:w,upload:F,uploadRule:U,value:b}=g,{files:E,setFiles:R,setCurrentFileIds:T}=e(s),D=a(b),{setValue:L}=r(),{dispatchFieldEvent:h}=l(),O=t();i((()=>{O.current=o()}),[]),i((()=>{E.forEach((async(e,t)=>{try{switch(e.status){case n.INJECTED:await M(e,t);break;case n.NONE:await v(e,t);break;case n.UPLOAD_READY:await N(e,t);break;case n.TO_DELETE:P(t)}}catch(e){x(t)}}));const e=E.filter((({status:e})=>e===n.UPLOADED)),t=e.filter((({addedFrom:e})=>"schema"!==e)).length>0,i=E.filter((({status:e})=>e===n.TO_DELETE)).length>0,s=t||i;T(e.map((({fileItem:e})=>e.id))),L(I,e.map((({dataURL:e,fileItem:t,fileUrl:i,uploadResponse:s})=>({..."base64"===F.type?{dataURL:e}:{},fileId:t.id,fileName:t.name,fileUrl:i,uploadResponse:s}))),{shouldDirty:s,shouldTouch:t})}),[E.map((({fileItem:e,status:t})=>`${e?.id}-${t}`)).join(",")]),i((()=>{void 0!==D&&void 0===b&&E.length&&R([])}),[E,D,R,b]);const x=e=>{R((t=>{const i=[...t],s=t[e];return i[e]={...s,fileItem:{...s.fileItem,id:s.fileItem?.id||o(),name:s.rawFile.name,errorMessage:U?.errorMessage||m.UPLOAD().GENERIC},status:n.ERROR_GENERIC},i}))},z=async(e,t)=>{if(f.includes(t||e.fileItem?.type)){const t=await d.dataUrlToImage(e.dataURL),i=await d.resampleImage(t,{width:94,height:94,crop:!0});return await p.fileToDataUrl(i)}return""},A=async e=>{const{addedFrom:t,dataURL:i,rawFile:s}=e,a=await p.getType(s);if(!(!y.fileType?.length||y.fileType?.includes(a.ext)))return{errorMessage:y.errorMessage||m.UPLOAD().FILE_TYPE(y.fileType||[]),fileType:a,status:n.ERROR_FORMAT};if(w.maxSizeInKb>0){const e=1024*w.maxSizeInKb;if("base64"===F.type&&p.getFilesizeFromBase64(i)>e||"multipart"===F.type&&s.size>e)return{errorMessage:w.errorMessage||m.UPLOAD().MAX_FILE_SIZE(w.maxSizeInKb),fileType:a,status:n.ERROR_SIZE}}return"schema"===t?{fileType:a,status:n.UPLOADED}:{fileType:a,status:n.UPLOAD_READY}},M=async(e,t)=>{let i;if(R((e=>{const i=[...e];return i[t]={...e[t],status:n.INJECTING},i})),e.dataURL){const t=await p.dataUrlToBlob(e.dataURL);i=new File([t],e.rawFile.name)}else if(e.fileUrl){const t=await new c("",void 0,void 0,!1,{responseType:"blob"}).get(e.fileUrl),s=await p.getType(new File([t],e.rawFile.name));i=new File([t],e.rawFile.name,{type:s.mime}),e.dataURL=await p.fileToDataUrl(i)}const{errorMessage:s,fileType:a}=await A({...e,rawFile:i}),r=await z(e,a.mime);R((l=>{const m=[...l];return m[t]={...e,fileItem:{errorMessage:s,id:e.fileItem?.id||o(),name:p.deduplicateFileName(E.map((({fileItem:e})=>e?.name)),t,i.name),progress:1,size:i.size,type:a.mime,thumbnailImageDataUrl:r},rawFile:i,status:n.UPLOADED},m}))},v=async(e,t)=>{const i=await S(e),s=await p.fileToDataUrl(i.rawFile),{errorMessage:a,fileType:r,status:l}=await A({dataURL:s,...i});R((e=>{const n=[...e];return n[t]={...i,dataURL:s,fileItem:{errorMessage:a,id:o(),name:p.deduplicateFileName(E.map((({fileItem:e})=>e?.name)),t,p.sanitizeFileName(i.rawFile.name)),size:i.rawFile.size,type:r.mime,progress:0},status:l},n}))},N=async(e,t)=>{R((e=>{const i=[...e];return i[t]={...e[t],status:n.UPLOADING},i}));const i=new FormData;i.append("sessionId",F?.sessionId||O.current||""),i.append("fileId",e.fileItem.id),i.append("slot",e.slot.toString()),"base64"===F.type?i.append("dataURL",e.dataURL):"multipart"===F.type&&i.append("file",e.rawFile,e.fileItem?.name);try{const s=await new c("",void 0,void 0,!0).post(F.url,i,{headers:{"Content-Type":"base64"===F.type?"application/json":"multipart/form-data",...F.headers},onUploadProgress:e=>{const{loaded:i,total:s}=e;R((e=>{if(!e[t])return e;const a=[...e];return a[t]={...e[t],fileItem:{...e[t].fileItem,progress:i/s}},a}))}}),a=await z(e);R((e=>{if(!e[t])return e;const i=[...e];return i[t]={...e[t],fileItem:{...e[t].fileItem,progress:1,thumbnailImageDataUrl:a},fileUrl:s?.data?.fileUrl,status:n.UPLOADED,uploadResponse:s},i}))}catch(t){throw h("upload-error",I,{fileId:e.fileItem.id,errorData:t?.response?.data}),t}},P=e=>{R((t=>t.filter(((t,i)=>i!==e))))},S=async e=>{if(w.maxSizeInKb>0&&u){const t=1024*w.maxSizeInKb;if(e.rawFile.size>t){const t=await p.getType(e.rawFile);if(f.includes(t.mime)){let t=await d.compressImage(e.rawFile,{fileSize:w.maxSizeInKb});return t instanceof Blob&&(t=p.blobToFile(t,{name:e.rawFile.name,lastModified:e.rawFile.lastModified})),{...e,rawFile:t}}}}return e};return null};export{g as default};
2
- //# sourceMappingURL=file-upload-manager.88131e38.js.map
1
+ import{useContext as e,useRef as t,useEffect as i}from"react";import{F as s,u as a,a as r,b as l,g as o,E as n,c as m,d as p,A as c,I as d}from"./index.a88ac40b.js";import"react/jsx-runtime";import"@lifesg/react-design-system/text";import"@lifesg/react-design-system/markup";import"react-dom/server";import"@lifesg/react-design-system/media";import"@lifesg/react-design-system/color";import"styled-components";import"@lifesg/react-design-system/button";import"@lifesg/react-design-system/modal";import"@lifesg/react-design-system/alert";import"@lifesg/react-design-system/layout";import"@lifesg/react-design-system/box-container";import"@lifesg/react-design-system/divider";import"@lifesg/react-design-system/text-list";import"@lifesg/react-design-system/popover-v2";import"@lifesg/react-icons";import"@lifesg/react-design-system/tab";import"@lifesg/react-icons/plus-circle-fill";import"@lifesg/react-design-system/button-with-icon";import"@lifesg/react-design-system/error-display";import"@lifesg/react-design-system/filter";import"@lifesg/react-design-system/uneditable-section";import"@lifesg/react-design-system/timeline";import"@lifesg/react-design-system/form";import"@lifesg/react-design-system/toggle";import"@lifesg/react-design-system/checkbox";import"@lifesg/react-design-system/file-upload";import"@lifesg/react-icons/cross";import"@lifesg/react-design-system/icon-button";import"@lifesg/react-icons/bin";import"@lifesg/react-icons/eraser";import"@lifesg/react-icons/pencil";import"@lifesg/react-icons/pencil-stroke";import"@lifesg/react-design-system";import"@lifesg/react-icons/plus";import"@lifesg/react-icons/exclamation-triangle";import"@lifesg/react-icons/pin-fill";import"@lifesg/react-design-system/design-token";import"@lifesg/react-design-system/image-button";import"@lifesg/react-design-system/radio-button";const f=["image/jpeg","image/gif","image/png"],g=g=>{const{compressImages:u,fileTypeRule:y,id:I,maxFileSizeRule:w,upload:F,uploadRule:U,value:b}=g,{files:E,setFiles:R,setCurrentFileIds:T}=e(s),D=a(b),{setValue:L}=r(),{dispatchFieldEvent:h}=l(),O=t();i((()=>{O.current=o()}),[]),i((()=>{E.forEach((async(e,t)=>{try{switch(e.status){case n.INJECTED:await M(e,t);break;case n.NONE:await v(e,t);break;case n.UPLOAD_READY:await N(e,t);break;case n.TO_DELETE:P(t)}}catch(e){x(t)}}));const e=E.filter((({status:e})=>e===n.UPLOADED)),t=e.filter((({addedFrom:e})=>"schema"!==e)).length>0,i=E.filter((({status:e})=>e===n.TO_DELETE)).length>0,s=t||i;T(e.map((({fileItem:e})=>e.id))),L(I,e.map((({dataURL:e,fileItem:t,fileUrl:i,uploadResponse:s})=>({..."base64"===F.type?{dataURL:e}:{},fileId:t.id,fileName:t.name,fileUrl:i,uploadResponse:s}))),{shouldDirty:s,shouldTouch:t})}),[E.map((({fileItem:e,status:t})=>`${e?.id}-${t}`)).join(",")]),i((()=>{void 0!==D&&void 0===b&&E.length&&R([])}),[E,D,R,b]);const x=e=>{R((t=>{const i=[...t],s=t[e];return i[e]={...s,fileItem:{...s.fileItem,id:s.fileItem?.id||o(),name:s.rawFile.name,errorMessage:U?.errorMessage||m.UPLOAD().GENERIC},status:n.ERROR_GENERIC},i}))},z=async(e,t)=>{if(f.includes(t||e.fileItem?.type)){const t=await d.dataUrlToImage(e.dataURL),i=await d.resampleImage(t,{width:94,height:94,crop:!0});return await p.fileToDataUrl(i)}return""},A=async e=>{const{addedFrom:t,dataURL:i,rawFile:s}=e,a=await p.getType(s);if(!(!y.fileType?.length||y.fileType?.includes(a.ext)))return{errorMessage:y.errorMessage||m.UPLOAD().FILE_TYPE(y.fileType||[]),fileType:a,status:n.ERROR_FORMAT};if(w.maxSizeInKb>0){const e=1024*w.maxSizeInKb;if("base64"===F.type&&p.getFilesizeFromBase64(i)>e||"multipart"===F.type&&s.size>e)return{errorMessage:w.errorMessage||m.UPLOAD().MAX_FILE_SIZE(w.maxSizeInKb),fileType:a,status:n.ERROR_SIZE}}return"schema"===t?{fileType:a,status:n.UPLOADED}:{fileType:a,status:n.UPLOAD_READY}},M=async(e,t)=>{let i;if(R((e=>{const i=[...e];return i[t]={...e[t],status:n.INJECTING},i})),e.dataURL){const t=await p.dataUrlToBlob(e.dataURL);i=new File([t],e.rawFile.name)}else if(e.fileUrl){const t=await new c("",void 0,void 0,!1,{responseType:"blob"}).get(e.fileUrl),s=await p.getType(new File([t],e.rawFile.name));i=new File([t],e.rawFile.name,{type:s.mime}),e.dataURL=await p.fileToDataUrl(i)}const{errorMessage:s,fileType:a}=await A({...e,rawFile:i}),r=await z(e,a.mime);R((l=>{const m=[...l];return m[t]={...e,fileItem:{errorMessage:s,id:e.fileItem?.id||o(),name:p.deduplicateFileName(E.map((({fileItem:e})=>e?.name)),t,i.name),progress:1,size:i.size,type:a.mime,thumbnailImageDataUrl:r},rawFile:i,status:n.UPLOADED},m}))},v=async(e,t)=>{const i=await S(e),s=await p.fileToDataUrl(i.rawFile),{errorMessage:a,fileType:r,status:l}=await A({dataURL:s,...i});R((e=>{const n=[...e];return n[t]={...i,dataURL:s,fileItem:{errorMessage:a,id:o(),name:p.deduplicateFileName(E.map((({fileItem:e})=>e?.name)),t,p.sanitizeFileName(i.rawFile.name)),size:i.rawFile.size,type:r.mime,progress:0},status:l},n}))},N=async(e,t)=>{R((e=>{const i=[...e];return i[t]={...e[t],status:n.UPLOADING},i}));const i=new FormData;i.append("sessionId",F?.sessionId||O.current||""),i.append("fileId",e.fileItem.id),i.append("slot",e.slot.toString()),"base64"===F.type?i.append("dataURL",e.dataURL):"multipart"===F.type&&i.append("file",e.rawFile,e.fileItem?.name);try{const s=await new c("",void 0,void 0,!0).post(F.url,i,{headers:{"Content-Type":"base64"===F.type?"application/json":"multipart/form-data",...F.headers},onUploadProgress:e=>{const{loaded:i,total:s}=e;R((e=>{if(!e[t])return e;const a=[...e];return a[t]={...e[t],fileItem:{...e[t].fileItem,progress:i/s}},a}))}}),a=await z(e);R((e=>{if(!e[t])return e;const i=[...e];return i[t]={...e[t],fileItem:{...e[t].fileItem,progress:1,thumbnailImageDataUrl:a},fileUrl:s?.data?.fileUrl,status:n.UPLOADED,uploadResponse:s},i}))}catch(t){throw h("upload-error",I,{fileId:e.fileItem.id,errorData:t?.response?.data}),t}},P=e=>{R((t=>t.filter(((t,i)=>i!==e))))},S=async e=>{if(w.maxSizeInKb>0&&u){const t=1024*w.maxSizeInKb;if(e.rawFile.size>t){const t=await p.getType(e.rawFile);if(f.includes(t.mime)){let t=await d.compressImage(e.rawFile,{fileSize:w.maxSizeInKb});return t instanceof Blob&&(t=p.blobToFile(t,{name:e.rawFile.name,lastModified:e.rawFile.lastModified})),{...e,rawFile:t}}}}return e};return null};export{g as default};
2
+ //# sourceMappingURL=file-upload-manager.1786802e.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload-manager.88131e38.js","sources":["../../src/components/fields/file-upload/file-upload-manager.ts"],"sourcesContent":["import { AxiosError } from \"axios\";\nimport { useContext, useEffect, useRef } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { AxiosApiClient, FileHelper, ImageHelper, generateRandomId } from \"../../../utils\";\nimport { useFieldEvent, usePrevious } from \"../../../utils/hooks\";\nimport { ERROR_MESSAGES } from \"../../shared\";\nimport { FileUploadContext } from \"./file-upload-context\";\nimport {\n\tEFileStatus,\n\tIFile,\n\tIFileUploadSchema,\n\tIFileUploadValidationRule,\n\tIFileUploadValue,\n\tTUploadErrorDetail,\n} from \"./types\";\n\ninterface IProps {\n\tcompressImages: boolean;\n\tfileTypeRule: IFileUploadValidationRule;\n\tid: string;\n\tmaxFileSizeRule: IFileUploadValidationRule;\n\tupload: IFileUploadSchema[\"uploadOnAddingFile\"];\n\tuploadRule: IFileUploadValidationRule;\n\tvalue: IFileUploadValue[];\n}\n\nconst RESIZEABLE_IMAGE_TYPES = [\"image/jpeg\", \"image/gif\", \"image/png\"];\n\nconst FileUploadManager = (props: IProps) => {\n\t// =============================================================================\n\t// CONST, STATE, REFS\n\t// =============================================================================\n\tconst { compressImages, fileTypeRule, id, maxFileSizeRule, upload, uploadRule, value } = props;\n\tconst { files, setFiles, setCurrentFileIds } = useContext(FileUploadContext);\n\tconst previousValue = usePrevious(value);\n\tconst { setValue } = useFormContext();\n\tconst { dispatchFieldEvent } = useFieldEvent();\n\tconst sessionId = useRef<string>();\n\n\t// =============================================================================\n\t// EFFECTS\n\t// =============================================================================\n\tuseEffect(() => {\n\t\tsessionId.current = generateRandomId();\n\t}, []);\n\n\tuseEffect(\n\t\t() => {\n\t\t\t// handle file status\n\t\t\tfiles.forEach(async (file, index) => {\n\t\t\t\ttry {\n\t\t\t\t\tswitch (file.status) {\n\t\t\t\t\t\tcase EFileStatus.INJECTED:\n\t\t\t\t\t\t\tawait injectFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.NONE:\n\t\t\t\t\t\t\tawait parseFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.UPLOAD_READY:\n\t\t\t\t\t\t\tawait uploadFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.TO_DELETE:\n\t\t\t\t\t\t\tdeleteFile(index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\thandleGenericError(index);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// track / update values\n\t\t\tconst uploadedFiles = files.filter(({ status }) => status === EFileStatus.UPLOADED);\n\t\t\tconst notPrefilledFiles = uploadedFiles.filter(({ addedFrom }) => addedFrom !== \"schema\");\n\t\t\tconst hasNotPrefilledFiles = notPrefilledFiles.length > 0;\n\t\t\tconst gotDeleteFiles = files.filter(({ status }) => status === EFileStatus.TO_DELETE).length > 0;\n\n\t\t\t/**\n\t\t\t * should dirty if\n\t\t\t * - it is dirty in the first place\n\t\t\t * - there are non-prefilled files\n\t\t\t * - user deleted file (differentiated from reset)\n\t\t\t */\n\t\t\tconst shouldDirty = hasNotPrefilledFiles || gotDeleteFiles;\n\n\t\t\tsetCurrentFileIds(uploadedFiles.map(({ fileItem }) => fileItem.id));\n\n\t\t\tsetValue(\n\t\t\t\tid,\n\t\t\t\tuploadedFiles.map(({ dataURL, fileItem, fileUrl, uploadResponse }) => ({\n\t\t\t\t\t...(upload.type === \"base64\" ? { dataURL } : {}),\n\t\t\t\t\tfileId: fileItem.id,\n\t\t\t\t\tfileName: fileItem.name,\n\t\t\t\t\tfileUrl,\n\t\t\t\t\tuploadResponse,\n\t\t\t\t})),\n\t\t\t\t{ shouldDirty, shouldTouch: hasNotPrefilledFiles }\n\t\t\t);\n\t\t}, // eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[files.map(({ fileItem, status }) => `${fileItem?.id}-${status}`).join(\",\")]\n\t);\n\n\t// for reset\n\tuseEffect(() => {\n\t\tif (previousValue !== undefined && value === undefined && files.length) {\n\t\t\tsetFiles([]);\n\t\t}\n\t}, [files, previousValue, setFiles, value]);\n\n\t// =============================================================================\n\t// HELPER FUNCTIONS\n\t// =============================================================================\n\n\tconst handleGenericError = (index: number) => {\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tconst file = prev[index];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...file,\n\t\t\t\tfileItem: {\n\t\t\t\t\t...file.fileItem,\n\t\t\t\t\tid: file.fileItem?.id || generateRandomId(),\n\t\t\t\t\tname: file.rawFile.name,\n\t\t\t\t\terrorMessage: uploadRule?.errorMessage || ERROR_MESSAGES.UPLOAD().GENERIC,\n\t\t\t\t},\n\t\t\t\tstatus: EFileStatus.ERROR_GENERIC,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst generateThumbnail = async (file: IFile, fileType?: string | undefined) => {\n\t\tif (RESIZEABLE_IMAGE_TYPES.includes(fileType || file.fileItem?.type)) {\n\t\t\tconst image = await ImageHelper.dataUrlToImage(file.dataURL);\n\t\t\tconst thumbnail = await ImageHelper.resampleImage(image, { width: 94, height: 94, crop: true });\n\t\t\treturn await FileHelper.fileToDataUrl(thumbnail);\n\t\t}\n\t\treturn \"\";\n\t};\n\n\tconst readFile = async (fileToRead: IFile) => {\n\t\tconst { addedFrom, dataURL, rawFile } = fileToRead;\n\t\tconst fileType = await FileHelper.getType(rawFile);\n\t\tconst validFileType = fileTypeRule.fileType?.length ? fileTypeRule.fileType?.includes(fileType.ext) : true;\n\n\t\tif (!validFileType) {\n\t\t\treturn {\n\t\t\t\terrorMessage:\n\t\t\t\t\tfileTypeRule.errorMessage || ERROR_MESSAGES.UPLOAD().FILE_TYPE(fileTypeRule.fileType || []),\n\t\t\t\tfileType,\n\t\t\t\tstatus: EFileStatus.ERROR_FORMAT,\n\t\t\t};\n\t\t}\n\n\t\tif (maxFileSizeRule.maxSizeInKb > 0) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (\n\t\t\t\t(upload.type === \"base64\" && FileHelper.getFilesizeFromBase64(dataURL) > maxSizeInB) ||\n\t\t\t\t(upload.type === \"multipart\" && rawFile.size > maxSizeInB)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\tmaxFileSizeRule.errorMessage ||\n\t\t\t\t\t\tERROR_MESSAGES.UPLOAD().MAX_FILE_SIZE(maxFileSizeRule.maxSizeInKb),\n\t\t\t\t\tfileType,\n\t\t\t\t\tstatus: EFileStatus.ERROR_SIZE,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (addedFrom === \"schema\") {\n\t\t\treturn {\n\t\t\t\tfileType,\n\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tfileType,\n\t\t\tstatus: EFileStatus.UPLOAD_READY,\n\t\t};\n\t};\n\n\t// =============================================================================\n\t// FILE STATUS HANDLERS\n\t// =============================================================================\n\tconst injectFile = async (fileToInject: IFile, index: number) => {\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...prev[index],\n\t\t\t\tstatus: EFileStatus.INJECTING,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\n\t\tlet rawFile: File;\n\t\tif (fileToInject.dataURL) {\n\t\t\tconst blob = await FileHelper.dataUrlToBlob(fileToInject.dataURL);\n\t\t\trawFile = new File([blob], fileToInject.rawFile.name);\n\t\t} else if (fileToInject.fileUrl) {\n\t\t\tconst response: Blob = await new AxiosApiClient(\"\", undefined, undefined, false, {\n\t\t\t\tresponseType: \"blob\",\n\t\t\t}).get(fileToInject.fileUrl);\n\t\t\tconst fileType = await FileHelper.getType(new File([response], fileToInject.rawFile.name));\n\t\t\trawFile = new File([response], fileToInject.rawFile.name, { type: fileType.mime });\n\t\t\tfileToInject.dataURL = await FileHelper.fileToDataUrl(rawFile);\n\t\t}\n\t\tconst { errorMessage, fileType } = await readFile({ ...fileToInject, rawFile });\n\t\tconst thumbnailImageDataUrl = await generateThumbnail(fileToInject, fileType.mime);\n\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...fileToInject,\n\t\t\t\tfileItem: {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tid: fileToInject.fileItem?.id || generateRandomId(),\n\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\tfiles.map(({ fileItem }) => fileItem?.name),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\trawFile.name\n\t\t\t\t\t),\n\t\t\t\t\tprogress: 1,\n\t\t\t\t\tsize: rawFile.size,\n\t\t\t\t\ttype: fileType.mime,\n\t\t\t\t\tthumbnailImageDataUrl,\n\t\t\t\t},\n\t\t\t\trawFile,\n\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst parseFile = async (fileToParse: IFile, index: number) => {\n\t\tconst compressedFile = await compressImageFile(fileToParse);\n\t\tconst dataURL = await FileHelper.fileToDataUrl(compressedFile.rawFile);\n\t\tconst { errorMessage, fileType, status } = await readFile({ dataURL, ...compressedFile });\n\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...compressedFile,\n\t\t\t\tdataURL,\n\t\t\t\tfileItem: {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tid: generateRandomId(),\n\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\tfiles.map(({ fileItem }) => fileItem?.name),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tFileHelper.sanitizeFileName(compressedFile.rawFile.name)\n\t\t\t\t\t),\n\t\t\t\t\tsize: compressedFile.rawFile.size,\n\t\t\t\t\ttype: fileType.mime,\n\t\t\t\t\tprogress: 0,\n\t\t\t\t},\n\t\t\t\tstatus,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst uploadFile = async (fileToUpload: IFile, index: number) => {\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...prev[index],\n\t\t\t\tstatus: EFileStatus.UPLOADING,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\n\t\tconst formData = new FormData();\n\t\tformData.append(\"sessionId\", upload?.sessionId || sessionId.current || \"\");\n\t\tformData.append(\"fileId\", fileToUpload.fileItem.id);\n\t\tformData.append(\"slot\", fileToUpload.slot.toString());\n\t\tif (upload.type === \"base64\") {\n\t\t\tformData.append(\"dataURL\", fileToUpload.dataURL);\n\t\t} else if (upload.type === \"multipart\") {\n\t\t\tformData.append(\"file\", fileToUpload.rawFile, fileToUpload.fileItem?.name);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await new AxiosApiClient(\"\", undefined, undefined, true).post(upload.url, formData, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": upload.type === \"base64\" ? \"application/json\" : \"multipart/form-data\",\n\t\t\t\t\t...upload.headers,\n\t\t\t\t},\n\t\t\t\tonUploadProgress: (progressEvent) => {\n\t\t\t\t\tconst { loaded, total } = progressEvent;\n\t\t\t\t\tsetFiles((prev) => {\n\t\t\t\t\t\tif (!prev[index]) return prev;\n\t\t\t\t\t\tconst updatedFiles = [...prev];\n\t\t\t\t\t\tupdatedFiles[index] = {\n\t\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\t\tfileItem: {\n\t\t\t\t\t\t\t\t...prev[index].fileItem,\n\t\t\t\t\t\t\t\tprogress: loaded / total,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn updatedFiles;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst thumbnailImageDataUrl = await generateThumbnail(fileToUpload);\n\t\t\tsetFiles((prev) => {\n\t\t\t\tif (!prev[index]) return prev;\n\t\t\t\tconst updatedFiles = [...prev];\n\t\t\t\tupdatedFiles[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tfileItem: {\n\t\t\t\t\t\t...prev[index].fileItem,\n\t\t\t\t\t\tprogress: 1,\n\t\t\t\t\t\tthumbnailImageDataUrl,\n\t\t\t\t\t},\n\t\t\t\t\tfileUrl: response?.[\"data\"]?.[\"fileUrl\"],\n\t\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t\t\tuploadResponse: response,\n\t\t\t\t};\n\t\t\t\treturn updatedFiles;\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tdispatchFieldEvent<TUploadErrorDetail>(\"upload-error\", id, {\n\t\t\t\tfileId: fileToUpload.fileItem.id,\n\t\t\t\terrorData: (err as AxiosError)?.response?.data,\n\t\t\t});\n\n\t\t\tthrow err;\n\t\t}\n\t};\n\n\tconst deleteFile = (index: number) => {\n\t\tsetFiles((prev) => prev.filter((_file, i) => i !== index));\n\t};\n\n\tconst compressImageFile = async (fileToCompress: IFile) => {\n\t\tif (maxFileSizeRule.maxSizeInKb > 0 && compressImages) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (fileToCompress.rawFile.size > maxSizeInB) {\n\t\t\t\tconst fileType = await FileHelper.getType(fileToCompress.rawFile);\n\t\t\t\tif (RESIZEABLE_IMAGE_TYPES.includes(fileType.mime)) {\n\t\t\t\t\tlet fileOrBlob = await ImageHelper.compressImage(fileToCompress.rawFile, {\n\t\t\t\t\t\tfileSize: maxFileSizeRule.maxSizeInKb,\n\t\t\t\t\t});\n\t\t\t\t\tif (fileOrBlob instanceof Blob) {\n\t\t\t\t\t\tfileOrBlob = FileHelper.blobToFile(fileOrBlob, {\n\t\t\t\t\t\t\tname: fileToCompress.rawFile.name,\n\t\t\t\t\t\t\tlastModified: fileToCompress.rawFile.lastModified,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fileToCompress,\n\t\t\t\t\t\trawFile: fileOrBlob,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fileToCompress;\n\t};\n\n\t// =============================================================================\n\t// RENDER FUNCTIONS\n\t// =============================================================================\n\treturn null;\n};\n\nexport default FileUploadManager;\n"],"names":["RESIZEABLE_IMAGE_TYPES","FileUploadManager","props","compressImages","fileTypeRule","id","maxFileSizeRule","upload","uploadRule","value","files","setFiles","setCurrentFileIds","useContext","FileUploadContext","previousValue","usePrevious","setValue","useFormContext","dispatchFieldEvent","useFieldEvent","sessionId","useRef","useEffect","current","generateRandomId","forEach","async","file","index","status","EFileStatus","INJECTED","injectFile","NONE","parseFile","UPLOAD_READY","uploadFile","TO_DELETE","deleteFile","err","handleGenericError","uploadedFiles","filter","UPLOADED","hasNotPrefilledFiles","addedFrom","length","gotDeleteFiles","shouldDirty","map","fileItem","dataURL","fileUrl","uploadResponse","type","fileId","fileName","name","shouldTouch","join","undefined","prev","updatedFiles","rawFile","errorMessage","ERROR_MESSAGES","UPLOAD","GENERIC","ERROR_GENERIC","generateThumbnail","fileType","includes","image","ImageHelper","dataUrlToImage","thumbnail","resampleImage","width","height","crop","FileHelper","fileToDataUrl","readFile","fileToRead","getType","ext","FILE_TYPE","ERROR_FORMAT","maxSizeInKb","maxSizeInB","getFilesizeFromBase64","size","MAX_FILE_SIZE","ERROR_SIZE","fileToInject","INJECTING","blob","dataUrlToBlob","File","response","AxiosApiClient","responseType","get","mime","thumbnailImageDataUrl","deduplicateFileName","progress","fileToParse","compressedFile","compressImageFile","sanitizeFileName","fileToUpload","UPLOADING","formData","FormData","append","slot","toString","post","url","headers","onUploadProgress","progressEvent","loaded","total","errorData","data","_file","i","fileToCompress","fileOrBlob","compressImage","fileSize","Blob","blobToFile","lastModified"],"mappings":"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"}
1
+ {"version":3,"file":"file-upload-manager.1786802e.js","sources":["../../src/components/fields/file-upload/file-upload-manager.ts"],"sourcesContent":["import { AxiosError } from \"axios\";\nimport { useContext, useEffect, useRef } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { AxiosApiClient, FileHelper, ImageHelper, generateRandomId } from \"../../../utils\";\nimport { useFieldEvent, usePrevious } from \"../../../utils/hooks\";\nimport { ERROR_MESSAGES } from \"../../shared\";\nimport { FileUploadContext } from \"./file-upload-context\";\nimport {\n\tEFileStatus,\n\tIFile,\n\tIFileUploadSchema,\n\tIFileUploadValidationRule,\n\tIFileUploadValue,\n\tTUploadErrorDetail,\n} from \"./types\";\n\ninterface IProps {\n\tcompressImages: boolean;\n\tfileTypeRule: IFileUploadValidationRule;\n\tid: string;\n\tmaxFileSizeRule: IFileUploadValidationRule;\n\tupload: IFileUploadSchema[\"uploadOnAddingFile\"];\n\tuploadRule: IFileUploadValidationRule;\n\tvalue: IFileUploadValue[];\n}\n\nconst RESIZEABLE_IMAGE_TYPES = [\"image/jpeg\", \"image/gif\", \"image/png\"];\n\nconst FileUploadManager = (props: IProps) => {\n\t// =============================================================================\n\t// CONST, STATE, REFS\n\t// =============================================================================\n\tconst { compressImages, fileTypeRule, id, maxFileSizeRule, upload, uploadRule, value } = props;\n\tconst { files, setFiles, setCurrentFileIds } = useContext(FileUploadContext);\n\tconst previousValue = usePrevious(value);\n\tconst { setValue } = useFormContext();\n\tconst { dispatchFieldEvent } = useFieldEvent();\n\tconst sessionId = useRef<string>();\n\n\t// =============================================================================\n\t// EFFECTS\n\t// =============================================================================\n\tuseEffect(() => {\n\t\tsessionId.current = generateRandomId();\n\t}, []);\n\n\tuseEffect(\n\t\t() => {\n\t\t\t// handle file status\n\t\t\tfiles.forEach(async (file, index) => {\n\t\t\t\ttry {\n\t\t\t\t\tswitch (file.status) {\n\t\t\t\t\t\tcase EFileStatus.INJECTED:\n\t\t\t\t\t\t\tawait injectFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.NONE:\n\t\t\t\t\t\t\tawait parseFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.UPLOAD_READY:\n\t\t\t\t\t\t\tawait uploadFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.TO_DELETE:\n\t\t\t\t\t\t\tdeleteFile(index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\thandleGenericError(index);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// track / update values\n\t\t\tconst uploadedFiles = files.filter(({ status }) => status === EFileStatus.UPLOADED);\n\t\t\tconst notPrefilledFiles = uploadedFiles.filter(({ addedFrom }) => addedFrom !== \"schema\");\n\t\t\tconst hasNotPrefilledFiles = notPrefilledFiles.length > 0;\n\t\t\tconst gotDeleteFiles = files.filter(({ status }) => status === EFileStatus.TO_DELETE).length > 0;\n\n\t\t\t/**\n\t\t\t * should dirty if\n\t\t\t * - it is dirty in the first place\n\t\t\t * - there are non-prefilled files\n\t\t\t * - user deleted file (differentiated from reset)\n\t\t\t */\n\t\t\tconst shouldDirty = hasNotPrefilledFiles || gotDeleteFiles;\n\n\t\t\tsetCurrentFileIds(uploadedFiles.map(({ fileItem }) => fileItem.id));\n\n\t\t\tsetValue(\n\t\t\t\tid,\n\t\t\t\tuploadedFiles.map(({ dataURL, fileItem, fileUrl, uploadResponse }) => ({\n\t\t\t\t\t...(upload.type === \"base64\" ? { dataURL } : {}),\n\t\t\t\t\tfileId: fileItem.id,\n\t\t\t\t\tfileName: fileItem.name,\n\t\t\t\t\tfileUrl,\n\t\t\t\t\tuploadResponse,\n\t\t\t\t})),\n\t\t\t\t{ shouldDirty, shouldTouch: hasNotPrefilledFiles }\n\t\t\t);\n\t\t}, // eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[files.map(({ fileItem, status }) => `${fileItem?.id}-${status}`).join(\",\")]\n\t);\n\n\t// for reset\n\tuseEffect(() => {\n\t\tif (previousValue !== undefined && value === undefined && files.length) {\n\t\t\tsetFiles([]);\n\t\t}\n\t}, [files, previousValue, setFiles, value]);\n\n\t// =============================================================================\n\t// HELPER FUNCTIONS\n\t// =============================================================================\n\n\tconst handleGenericError = (index: number) => {\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tconst file = prev[index];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...file,\n\t\t\t\tfileItem: {\n\t\t\t\t\t...file.fileItem,\n\t\t\t\t\tid: file.fileItem?.id || generateRandomId(),\n\t\t\t\t\tname: file.rawFile.name,\n\t\t\t\t\terrorMessage: uploadRule?.errorMessage || ERROR_MESSAGES.UPLOAD().GENERIC,\n\t\t\t\t},\n\t\t\t\tstatus: EFileStatus.ERROR_GENERIC,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst generateThumbnail = async (file: IFile, fileType?: string | undefined) => {\n\t\tif (RESIZEABLE_IMAGE_TYPES.includes(fileType || file.fileItem?.type)) {\n\t\t\tconst image = await ImageHelper.dataUrlToImage(file.dataURL);\n\t\t\tconst thumbnail = await ImageHelper.resampleImage(image, { width: 94, height: 94, crop: true });\n\t\t\treturn await FileHelper.fileToDataUrl(thumbnail);\n\t\t}\n\t\treturn \"\";\n\t};\n\n\tconst readFile = async (fileToRead: IFile) => {\n\t\tconst { addedFrom, dataURL, rawFile } = fileToRead;\n\t\tconst fileType = await FileHelper.getType(rawFile);\n\t\tconst validFileType = fileTypeRule.fileType?.length ? fileTypeRule.fileType?.includes(fileType.ext) : true;\n\n\t\tif (!validFileType) {\n\t\t\treturn {\n\t\t\t\terrorMessage:\n\t\t\t\t\tfileTypeRule.errorMessage || ERROR_MESSAGES.UPLOAD().FILE_TYPE(fileTypeRule.fileType || []),\n\t\t\t\tfileType,\n\t\t\t\tstatus: EFileStatus.ERROR_FORMAT,\n\t\t\t};\n\t\t}\n\n\t\tif (maxFileSizeRule.maxSizeInKb > 0) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (\n\t\t\t\t(upload.type === \"base64\" && FileHelper.getFilesizeFromBase64(dataURL) > maxSizeInB) ||\n\t\t\t\t(upload.type === \"multipart\" && rawFile.size > maxSizeInB)\n\t\t\t) {\n\t\t\t\treturn {\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\tmaxFileSizeRule.errorMessage ||\n\t\t\t\t\t\tERROR_MESSAGES.UPLOAD().MAX_FILE_SIZE(maxFileSizeRule.maxSizeInKb),\n\t\t\t\t\tfileType,\n\t\t\t\t\tstatus: EFileStatus.ERROR_SIZE,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\n\t\tif (addedFrom === \"schema\") {\n\t\t\treturn {\n\t\t\t\tfileType,\n\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tfileType,\n\t\t\tstatus: EFileStatus.UPLOAD_READY,\n\t\t};\n\t};\n\n\t// =============================================================================\n\t// FILE STATUS HANDLERS\n\t// =============================================================================\n\tconst injectFile = async (fileToInject: IFile, index: number) => {\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...prev[index],\n\t\t\t\tstatus: EFileStatus.INJECTING,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\n\t\tlet rawFile: File;\n\t\tif (fileToInject.dataURL) {\n\t\t\tconst blob = await FileHelper.dataUrlToBlob(fileToInject.dataURL);\n\t\t\trawFile = new File([blob], fileToInject.rawFile.name);\n\t\t} else if (fileToInject.fileUrl) {\n\t\t\tconst response: Blob = await new AxiosApiClient(\"\", undefined, undefined, false, {\n\t\t\t\tresponseType: \"blob\",\n\t\t\t}).get(fileToInject.fileUrl);\n\t\t\tconst fileType = await FileHelper.getType(new File([response], fileToInject.rawFile.name));\n\t\t\trawFile = new File([response], fileToInject.rawFile.name, { type: fileType.mime });\n\t\t\tfileToInject.dataURL = await FileHelper.fileToDataUrl(rawFile);\n\t\t}\n\t\tconst { errorMessage, fileType } = await readFile({ ...fileToInject, rawFile });\n\t\tconst thumbnailImageDataUrl = await generateThumbnail(fileToInject, fileType.mime);\n\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...fileToInject,\n\t\t\t\tfileItem: {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tid: fileToInject.fileItem?.id || generateRandomId(),\n\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\tfiles.map(({ fileItem }) => fileItem?.name),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\trawFile.name\n\t\t\t\t\t),\n\t\t\t\t\tprogress: 1,\n\t\t\t\t\tsize: rawFile.size,\n\t\t\t\t\ttype: fileType.mime,\n\t\t\t\t\tthumbnailImageDataUrl,\n\t\t\t\t},\n\t\t\t\trawFile,\n\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst parseFile = async (fileToParse: IFile, index: number) => {\n\t\tconst compressedFile = await compressImageFile(fileToParse);\n\t\tconst dataURL = await FileHelper.fileToDataUrl(compressedFile.rawFile);\n\t\tconst { errorMessage, fileType, status } = await readFile({ dataURL, ...compressedFile });\n\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...compressedFile,\n\t\t\t\tdataURL,\n\t\t\t\tfileItem: {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tid: generateRandomId(),\n\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\tfiles.map(({ fileItem }) => fileItem?.name),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tFileHelper.sanitizeFileName(compressedFile.rawFile.name)\n\t\t\t\t\t),\n\t\t\t\t\tsize: compressedFile.rawFile.size,\n\t\t\t\t\ttype: fileType.mime,\n\t\t\t\t\tprogress: 0,\n\t\t\t\t},\n\t\t\t\tstatus,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst uploadFile = async (fileToUpload: IFile, index: number) => {\n\t\tsetFiles((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...prev[index],\n\t\t\t\tstatus: EFileStatus.UPLOADING,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\n\t\tconst formData = new FormData();\n\t\tformData.append(\"sessionId\", upload?.sessionId || sessionId.current || \"\");\n\t\tformData.append(\"fileId\", fileToUpload.fileItem.id);\n\t\tformData.append(\"slot\", fileToUpload.slot.toString());\n\t\tif (upload.type === \"base64\") {\n\t\t\tformData.append(\"dataURL\", fileToUpload.dataURL);\n\t\t} else if (upload.type === \"multipart\") {\n\t\t\tformData.append(\"file\", fileToUpload.rawFile, fileToUpload.fileItem?.name);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await new AxiosApiClient(\"\", undefined, undefined, true).post(upload.url, formData, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": upload.type === \"base64\" ? \"application/json\" : \"multipart/form-data\",\n\t\t\t\t\t...upload.headers,\n\t\t\t\t},\n\t\t\t\tonUploadProgress: (progressEvent) => {\n\t\t\t\t\tconst { loaded, total } = progressEvent;\n\t\t\t\t\tsetFiles((prev) => {\n\t\t\t\t\t\tif (!prev[index]) return prev;\n\t\t\t\t\t\tconst updatedFiles = [...prev];\n\t\t\t\t\t\tupdatedFiles[index] = {\n\t\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\t\tfileItem: {\n\t\t\t\t\t\t\t\t...prev[index].fileItem,\n\t\t\t\t\t\t\t\tprogress: loaded / total,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn updatedFiles;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst thumbnailImageDataUrl = await generateThumbnail(fileToUpload);\n\t\t\tsetFiles((prev) => {\n\t\t\t\tif (!prev[index]) return prev;\n\t\t\t\tconst updatedFiles = [...prev];\n\t\t\t\tupdatedFiles[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tfileItem: {\n\t\t\t\t\t\t...prev[index].fileItem,\n\t\t\t\t\t\tprogress: 1,\n\t\t\t\t\t\tthumbnailImageDataUrl,\n\t\t\t\t\t},\n\t\t\t\t\tfileUrl: response?.[\"data\"]?.[\"fileUrl\"],\n\t\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t\t\tuploadResponse: response,\n\t\t\t\t};\n\t\t\t\treturn updatedFiles;\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tdispatchFieldEvent<TUploadErrorDetail>(\"upload-error\", id, {\n\t\t\t\tfileId: fileToUpload.fileItem.id,\n\t\t\t\terrorData: (err as AxiosError)?.response?.data,\n\t\t\t});\n\n\t\t\tthrow err;\n\t\t}\n\t};\n\n\tconst deleteFile = (index: number) => {\n\t\tsetFiles((prev) => prev.filter((_file, i) => i !== index));\n\t};\n\n\tconst compressImageFile = async (fileToCompress: IFile) => {\n\t\tif (maxFileSizeRule.maxSizeInKb > 0 && compressImages) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (fileToCompress.rawFile.size > maxSizeInB) {\n\t\t\t\tconst fileType = await FileHelper.getType(fileToCompress.rawFile);\n\t\t\t\tif (RESIZEABLE_IMAGE_TYPES.includes(fileType.mime)) {\n\t\t\t\t\tlet fileOrBlob = await ImageHelper.compressImage(fileToCompress.rawFile, {\n\t\t\t\t\t\tfileSize: maxFileSizeRule.maxSizeInKb,\n\t\t\t\t\t});\n\t\t\t\t\tif (fileOrBlob instanceof Blob) {\n\t\t\t\t\t\tfileOrBlob = FileHelper.blobToFile(fileOrBlob, {\n\t\t\t\t\t\t\tname: fileToCompress.rawFile.name,\n\t\t\t\t\t\t\tlastModified: fileToCompress.rawFile.lastModified,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fileToCompress,\n\t\t\t\t\t\trawFile: fileOrBlob,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fileToCompress;\n\t};\n\n\t// =============================================================================\n\t// RENDER FUNCTIONS\n\t// =============================================================================\n\treturn null;\n};\n\nexport default FileUploadManager;\n"],"names":["RESIZEABLE_IMAGE_TYPES","FileUploadManager","props","compressImages","fileTypeRule","id","maxFileSizeRule","upload","uploadRule","value","files","setFiles","setCurrentFileIds","useContext","FileUploadContext","previousValue","usePrevious","setValue","useFormContext","dispatchFieldEvent","useFieldEvent","sessionId","useRef","useEffect","current","generateRandomId","forEach","async","file","index","status","EFileStatus","INJECTED","injectFile","NONE","parseFile","UPLOAD_READY","uploadFile","TO_DELETE","deleteFile","err","handleGenericError","uploadedFiles","filter","UPLOADED","hasNotPrefilledFiles","addedFrom","length","gotDeleteFiles","shouldDirty","map","fileItem","dataURL","fileUrl","uploadResponse","type","fileId","fileName","name","shouldTouch","join","undefined","prev","updatedFiles","rawFile","errorMessage","ERROR_MESSAGES","UPLOAD","GENERIC","ERROR_GENERIC","generateThumbnail","fileType","includes","image","ImageHelper","dataUrlToImage","thumbnail","resampleImage","width","height","crop","FileHelper","fileToDataUrl","readFile","fileToRead","getType","ext","FILE_TYPE","ERROR_FORMAT","maxSizeInKb","maxSizeInB","getFilesizeFromBase64","size","MAX_FILE_SIZE","ERROR_SIZE","fileToInject","INJECTING","blob","dataUrlToBlob","File","response","AxiosApiClient","responseType","get","mime","thumbnailImageDataUrl","deduplicateFileName","progress","fileToParse","compressedFile","compressImageFile","sanitizeFileName","fileToUpload","UPLOADING","formData","FormData","append","slot","toString","post","url","headers","onUploadProgress","progressEvent","loaded","total","errorData","data","_file","i","fileToCompress","fileOrBlob","compressImage","fileSize","Blob","blobToFile","lastModified"],"mappings":"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"}