@lifesg/web-frontend-engine 2.1.2 → 2.1.3

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.322f9ebd.js → file-upload-manager.06cbbbef.js} +2 -2
  2. package/chunks/{file-upload-manager.322f9ebd.js.map → file-upload-manager.06cbbbef.js.map} +1 -1
  3. package/chunks/{index.001bdfec.js → index.0280bf07.js} +2 -2
  4. package/chunks/{index.001bdfec.js.map → index.0280bf07.js.map} +1 -1
  5. package/chunks/{index.525d4dc8.js → index.48f1ff60.js} +5 -5
  6. package/chunks/{index.525d4dc8.js.map → index.48f1ff60.js.map} +1 -1
  7. package/chunks/{index.d39dccc1.js → index.4917b447.js} +2 -2
  8. package/chunks/{index.d39dccc1.js.map → index.4917b447.js.map} +1 -1
  9. package/chunks/{location-modal.db994c40.js → location-modal.9376e196.js} +2 -2
  10. package/chunks/{location-modal.db994c40.js.map → location-modal.9376e196.js.map} +1 -1
  11. package/cjs/chunks/{file-upload-manager.aebae412.js → file-upload-manager.2b5e51c8.js} +2 -2
  12. package/cjs/chunks/{file-upload-manager.aebae412.js.map → file-upload-manager.2b5e51c8.js.map} +1 -1
  13. package/cjs/chunks/{index.21340464.js → index.350cbda4.js} +2 -2
  14. package/cjs/chunks/{index.21340464.js.map → index.350cbda4.js.map} +1 -1
  15. package/cjs/chunks/{index.594875a2.js → index.5d896247.js} +5 -5
  16. package/cjs/chunks/{index.594875a2.js.map → index.5d896247.js.map} +1 -1
  17. package/cjs/chunks/{index.516d4b9b.js → index.eeb93deb.js} +2 -2
  18. package/cjs/chunks/{index.516d4b9b.js.map → index.eeb93deb.js.map} +1 -1
  19. package/cjs/chunks/{location-modal.c859475a.js → location-modal.80a5525d.js} +2 -2
  20. package/cjs/chunks/{location-modal.c859475a.js.map → location-modal.80a5525d.js.map} +1 -1
  21. package/cjs/index.js +1 -1
  22. package/index.js +1 -1
  23. package/package.json +1 -1
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),i=require("./index.594875a2.js");require("react/jsx-runtime"),require("@lifesg/react-design-system/theme"),require("styled-components"),require("@lifesg/react-design-system/markup"),require("react-dom/server"),require("@lifesg/react-design-system/typography"),require("@lifesg/react-design-system/button"),require("@lifesg/react-design-system/modal"),require("@lifesg/react-design-system/alert"),require("@lifesg/react-design-system/layout"),require("@lifesg/react-design-system/box-container"),require("@lifesg/react-design-system/divider"),require("@lifesg/react-design-system/v2_media"),require("@lifesg/react-design-system/text-list"),require("@lifesg/react-design-system/popover-v2"),require("@lifesg/react-icons"),require("@lifesg/react-design-system/tab"),require("@lifesg/react-icons/plus-circle-fill"),require("@lifesg/react-design-system/button-with-icon"),require("@lifesg/react-design-system/error-display"),require("@lifesg/react-design-system/filter"),require("@lifesg/react-design-system/uneditable-section"),require("@lifesg/react-design-system/timeline"),require("@lifesg/react-design-system/form"),require("@lifesg/react-design-system/checkbox"),require("@lifesg/react-design-system/toggle"),require("@lifesg/react-design-system/file-upload"),require("@lifesg/react-icons/cross"),require("@lifesg/react-design-system/icon-button"),require("@lifesg/react-icons/bin"),require("@lifesg/react-icons/eraser"),require("@lifesg/react-icons/pencil"),require("@lifesg/react-icons/pencil-stroke"),require("@lifesg/react-icons/plus"),require("@lifesg/react-icons/exclamation-triangle"),require("@lifesg/react-icons/pin-fill"),require("@lifesg/react-design-system/image-button"),require("@lifesg/react-design-system/radio-button"),require("@lifesg/react-design-system/v2_layout");const t=["image/jpeg","image/gif","image/png"];exports.default=s=>{const{compressImages:a,fileTypeRule:r,fileExtensionRule:l,hideThumbnail:n,id:o,maxFileSizeRule:u,upload:m,uploadRule:d,value:c}=s,{files:f,setFiles:g,setCurrentFileIds:p}=e.useContext(i.FileUploadContext),y=i.usePrevious(c),{setValue:F}=i.useFormContext(),{dispatchFieldEvent:E}=i.useFieldEvent(),I=e.useRef();e.useEffect((()=>{I.current=i.generateRandomId()}),[]),e.useEffect((()=>{f.forEach((async(e,t)=>{try{switch(e.status){case i.EFileStatus.INJECTED:await b(e,t);break;case i.EFileStatus.NONE:await h(e,t);break;case i.EFileStatus.UPLOAD_READY:await D(e,t);break;case i.EFileStatus.TO_DELETE:L(t)}}catch(e){R(t)}}));const e=f.filter((({status:e})=>e===i.EFileStatus.UPLOADED)),t=e.filter((({addedFrom:e})=>"schema"!==e)).length>0,s=f.filter((({status:e})=>e===i.EFileStatus.TO_DELETE)).length>0,a=t||s;p(e.map((({fileItem:e})=>e.id))),F(o,e.map((({dataURL:e,fileItem:i,fileUrl:t,uploadResponse:s})=>({..."base64"===m.type?{dataURL:e}:{},fileId:i.id,fileName:i.name,fileUrl:t,uploadResponse:s}))),{shouldDirty:a,shouldTouch:t})}),[f.map((({fileItem:e,status:i})=>`${e?.id}-${i}`)).join(",")]),e.useEffect((()=>{void 0!==y&&void 0===c&&f.length&&g([])}),[f,y,g,c]);const R=e=>{g((t=>{const s=[...t],a=t[e];return s[e]={...a,fileItem:{...a.fileItem,id:a.fileItem?.id||i.generateRandomId(),name:a.rawFile.name,errorMessage:d?.errorMessage||i.ERROR_MESSAGES.UPLOAD().GENERIC},status:i.EFileStatus.ERROR_GENERIC},s}))},w=async(e,s)=>{if(!0!==n&&t.includes(s||e.fileItem?.type)){const t=await i.ImageHelper.dataUrlToImage(e.dataURL),s=await i.ImageHelper.resampleImage(t,{width:94,height:94,crop:!0});return await i.FileHelper.fileToDataUrl(s)}return""},q=async e=>{const{addedFrom:t,dataURL:s,rawFile:a}=e,n=await i.FileHelper.getType(a),o=S(n);if(o?.status<0)return o;if(r.fileType&&l.fileExtension){const e=T(a.name);if(e?.status<0)return{...e,fileType:n}}const u="base64"===m.type?i.FileHelper.getFilesizeFromBase64(s):a.size,{errorMessage:d,status:c}=U(u);return c<0?{errorMessage:d,fileType:n,status:c}:"schema"===t?{fileType:n,status:i.EFileStatus.UPLOADED}:{fileType:n,status:i.EFileStatus.UPLOAD_READY}},S=e=>!r.fileType?.length||r.fileType?.includes(e.ext)?{}:{errorMessage:r.errorMessage||i.ERROR_MESSAGES.UPLOAD().FILE_TYPE(r.fileType||[]),fileType:e,status:i.EFileStatus.ERROR_FORMAT},T=e=>{const t=e?.includes(".")?e.split(".").pop().toLowerCase():void 0;return t&&l?.fileExtension?.includes(t)?{}:{errorMessage:l.errorMessage||i.ERROR_MESSAGES.UPLOAD().FILE_EXTENSION(r.fileType||[]),fileName:e,status:i.EFileStatus.ERROR_FORMAT}},U=e=>{if(u.maxSizeInKb>0){if(e>1024*u.maxSizeInKb)return{errorMessage:u.errorMessage||i.ERROR_MESSAGES.UPLOAD().MAX_FILE_SIZE(u.maxSizeInKb),status:i.EFileStatus.ERROR_SIZE}}return{}},b=async(e,t)=>{let s;if(g((e=>{const s=[...e];return s[t]={...e[t],status:i.EFileStatus.INJECTING},s})),e.dataURL){const t=await i.FileHelper.dataUrlToBlob(e.dataURL);s=new File([t],e.rawFile.name)}else if(e.fileUrl){const t=await new i.AxiosApiClient("",void 0,void 0,!1,{responseType:"blob"}).get(e.fileUrl),a=await i.FileHelper.getType(new File([t],e.rawFile.name));s=new File([t],e.rawFile.name,{type:a.mime}),e.dataURL=await i.FileHelper.fileToDataUrl(s)}const a=e.uploadResponse?.data||e.uploadResponse,{errorMessage:r,fileType:l}=s?await q({...e,rawFile:s}):S({mime:a?.mimeType,ext:a?.ext});let n=s?.size||a?.fileSize||0;isNaN(n)&&(n=0);const{errorMessage:o}=U(n),u=s?await w(e,l?.mime):void 0;g((m=>{const d=[...m];return d[t]={...e,fileItem:{errorMessage:r||o,id:e.fileItem?.id||i.generateRandomId(),name:i.FileHelper.deduplicateFileName(f.map((({fileItem:e})=>e.name)),t,s?.name||e.rawFile.name),progress:1,size:n,type:l?.mime||a?.mimeType,thumbnailImageDataUrl:u},rawFile:s,status:i.EFileStatus.UPLOADED},d}))},h=async(e,t)=>{const s=await x(e),a=await i.FileHelper.fileToDataUrl(s.rawFile),{errorMessage:r,fileType:l,status:n}=await q({dataURL:a,...s});g((e=>{const o=[...e];return o[t]={...s,dataURL:a,fileItem:{errorMessage:r,id:i.generateRandomId(),name:i.FileHelper.deduplicateFileName(f.map((({fileItem:e})=>e?.name)),t,i.FileHelper.sanitizeFileName(s.rawFile.name)),size:s.rawFile.size,type:l.mime,progress:0},status:n},o}))},D=async(e,t)=>{g((e=>{const s=[...e];return s[t]={...e[t],status:i.EFileStatus.UPLOADING},s}));const s=new FormData;s.append("sessionId",m?.sessionId||I.current||""),s.append("fileId",e.fileItem.id),s.append("slot",e.slot.toString()),"base64"===m.type?s.append("dataURL",e.dataURL):"multipart"===m.type&&s.append("file",e.rawFile,e.fileItem?.name);try{const a=await new i.AxiosApiClient("",void 0,void 0,!0).post(m.url,s,{headers:{"Content-Type":"base64"===m.type?"application/json":"multipart/form-data",...m.headers},onUploadProgress:e=>{const{loaded:i,total:s}=e;g((e=>{if(!e[t])return e;const a=[...e];return a[t]={...e[t],fileItem:{...e[t].fileItem,progress:i/s}},a}))}}),r=await w(e);g((e=>{if(!e[t])return e;const s=[...e];return s[t]={...e[t],fileItem:{...e[t].fileItem,progress:1,thumbnailImageDataUrl:r},fileUrl:a?.data?.fileUrl,status:i.EFileStatus.UPLOADED,uploadResponse:a},s}))}catch(i){throw E("upload-error",o,{fileId:e.fileItem.id,errorData:i?.response?.data}),i}},L=e=>{g((i=>i.filter(((i,t)=>t!==e))))},x=async e=>{if(u.maxSizeInKb>0&&a){const s=1024*u.maxSizeInKb;if(e.rawFile.size>s){const s=await i.FileHelper.getType(e.rawFile);if(t.includes(s.mime)){let t=await i.ImageHelper.compressImage(e.rawFile,{fileSize:u.maxSizeInKb});return t instanceof Blob&&(t=i.FileHelper.blobToFile(t,{name:e.rawFile.name,lastModified:e.rawFile.lastModified})),{...e,rawFile:t}}}}return e};return null};
2
- //# sourceMappingURL=file-upload-manager.aebae412.js.map
1
+ "use strict";var e=require("react"),i=require("./index.5d896247.js");require("react/jsx-runtime"),require("@lifesg/react-design-system/theme"),require("styled-components"),require("@lifesg/react-design-system/markup"),require("react-dom/server"),require("@lifesg/react-design-system/typography"),require("@lifesg/react-design-system/button"),require("@lifesg/react-design-system/modal"),require("@lifesg/react-design-system/alert"),require("@lifesg/react-design-system/layout"),require("@lifesg/react-design-system/box-container"),require("@lifesg/react-design-system/divider"),require("@lifesg/react-design-system/v2_media"),require("@lifesg/react-design-system/text-list"),require("@lifesg/react-design-system/popover-v2"),require("@lifesg/react-icons"),require("@lifesg/react-design-system/tab"),require("@lifesg/react-icons/plus-circle-fill"),require("@lifesg/react-design-system/button-with-icon"),require("@lifesg/react-design-system/error-display"),require("@lifesg/react-design-system/filter"),require("@lifesg/react-design-system/uneditable-section"),require("@lifesg/react-design-system/timeline"),require("@lifesg/react-design-system/form"),require("@lifesg/react-design-system/checkbox"),require("@lifesg/react-design-system/toggle"),require("@lifesg/react-design-system/file-upload"),require("@lifesg/react-icons/cross"),require("@lifesg/react-design-system/icon-button"),require("@lifesg/react-icons/bin"),require("@lifesg/react-icons/eraser"),require("@lifesg/react-icons/pencil"),require("@lifesg/react-icons/pencil-stroke"),require("@lifesg/react-icons/plus"),require("@lifesg/react-icons/exclamation-triangle"),require("@lifesg/react-icons/pin-fill"),require("@lifesg/react-design-system/image-button"),require("@lifesg/react-design-system/radio-button"),require("@lifesg/react-design-system/v2_layout");const t=["image/jpeg","image/gif","image/png"];exports.default=s=>{const{compressImages:a,fileTypeRule:r,fileExtensionRule:l,hideThumbnail:n,id:o,maxFileSizeRule:u,upload:m,uploadRule:d,value:c}=s,{files:f,setFiles:g,setCurrentFileIds:p}=e.useContext(i.FileUploadContext),y=i.usePrevious(c),{setValue:F}=i.useFormContext(),{dispatchFieldEvent:E}=i.useFieldEvent(),I=e.useRef();e.useEffect((()=>{I.current=i.generateRandomId()}),[]),e.useEffect((()=>{f.forEach((async(e,t)=>{try{switch(e.status){case i.EFileStatus.INJECTED:await b(e,t);break;case i.EFileStatus.NONE:await h(e,t);break;case i.EFileStatus.UPLOAD_READY:await D(e,t);break;case i.EFileStatus.TO_DELETE:L(t)}}catch(e){R(t)}}));const e=f.filter((({status:e})=>e===i.EFileStatus.UPLOADED)),t=e.filter((({addedFrom:e})=>"schema"!==e)).length>0,s=f.filter((({status:e})=>e===i.EFileStatus.TO_DELETE)).length>0,a=t||s;p(e.map((({fileItem:e})=>e.id))),F(o,e.map((({dataURL:e,fileItem:i,fileUrl:t,uploadResponse:s})=>({..."base64"===m.type?{dataURL:e}:{},fileId:i.id,fileName:i.name,fileUrl:t,uploadResponse:s}))),{shouldDirty:a,shouldTouch:t})}),[f.map((({fileItem:e,status:i})=>`${e?.id}-${i}`)).join(",")]),e.useEffect((()=>{void 0!==y&&void 0===c&&f.length&&g([])}),[f,y,g,c]);const R=e=>{g((t=>{const s=[...t],a=t[e];return s[e]={...a,fileItem:{...a.fileItem,id:a.fileItem?.id||i.generateRandomId(),name:a.rawFile.name,errorMessage:d?.errorMessage||i.ERROR_MESSAGES.UPLOAD().GENERIC},status:i.EFileStatus.ERROR_GENERIC},s}))},w=async(e,s)=>{if(!0!==n&&t.includes(s||e.fileItem?.type)){const t=await i.ImageHelper.dataUrlToImage(e.dataURL),s=await i.ImageHelper.resampleImage(t,{width:94,height:94,crop:!0});return await i.FileHelper.fileToDataUrl(s)}return""},q=async e=>{const{addedFrom:t,dataURL:s,rawFile:a}=e,n=await i.FileHelper.getType(a),o=S(n);if(o?.status<0)return o;if(r.fileType&&l.fileExtension){const e=T(a.name);if(e?.status<0)return{...e,fileType:n}}const u="base64"===m.type?i.FileHelper.getFilesizeFromBase64(s):a.size,{errorMessage:d,status:c}=U(u);return c<0?{errorMessage:d,fileType:n,status:c}:"schema"===t?{fileType:n,status:i.EFileStatus.UPLOADED}:{fileType:n,status:i.EFileStatus.UPLOAD_READY}},S=e=>!r.fileType?.length||r.fileType?.includes(e.ext)?{}:{errorMessage:r.errorMessage||i.ERROR_MESSAGES.UPLOAD().FILE_TYPE(r.fileType||[]),fileType:e,status:i.EFileStatus.ERROR_FORMAT},T=e=>{const t=e?.includes(".")?e.split(".").pop().toLowerCase():void 0;return t&&l?.fileExtension?.includes(t)?{}:{errorMessage:l.errorMessage||i.ERROR_MESSAGES.UPLOAD().FILE_EXTENSION(r.fileType||[]),fileName:e,status:i.EFileStatus.ERROR_FORMAT}},U=e=>{if(u.maxSizeInKb>0){if(e>1024*u.maxSizeInKb)return{errorMessage:u.errorMessage||i.ERROR_MESSAGES.UPLOAD().MAX_FILE_SIZE(u.maxSizeInKb),status:i.EFileStatus.ERROR_SIZE}}return{}},b=async(e,t)=>{let s;if(g((e=>{const s=[...e];return s[t]={...e[t],status:i.EFileStatus.INJECTING},s})),e.dataURL){const t=await i.FileHelper.dataUrlToBlob(e.dataURL);s=new File([t],e.rawFile.name)}else if(e.fileUrl){const t=await new i.AxiosApiClient("",void 0,void 0,!1,{responseType:"blob"}).get(e.fileUrl),a=await i.FileHelper.getType(new File([t],e.rawFile.name));s=new File([t],e.rawFile.name,{type:a.mime}),e.dataURL=await i.FileHelper.fileToDataUrl(s)}const a=e.uploadResponse?.data||e.uploadResponse,{errorMessage:r,fileType:l}=s?await q({...e,rawFile:s}):S({mime:a?.mimeType,ext:a?.ext});let n=s?.size||a?.fileSize||0;isNaN(n)&&(n=0);const{errorMessage:o}=U(n),u=s?await w(e,l?.mime):void 0;g((m=>{const d=[...m];return d[t]={...e,fileItem:{errorMessage:r||o,id:e.fileItem?.id||i.generateRandomId(),name:i.FileHelper.deduplicateFileName(f.map((({fileItem:e})=>e.name)),t,s?.name||e.rawFile.name),progress:1,size:n,type:l?.mime||a?.mimeType,thumbnailImageDataUrl:u},rawFile:s,status:i.EFileStatus.UPLOADED},d}))},h=async(e,t)=>{const s=await x(e),a=await i.FileHelper.fileToDataUrl(s.rawFile),{errorMessage:r,fileType:l,status:n}=await q({dataURL:a,...s});g((e=>{const o=[...e];return o[t]={...s,dataURL:a,fileItem:{errorMessage:r,id:i.generateRandomId(),name:i.FileHelper.deduplicateFileName(f.map((({fileItem:e})=>e?.name)),t,i.FileHelper.sanitizeFileName(s.rawFile.name)),size:s.rawFile.size,type:l.mime,progress:0},status:n},o}))},D=async(e,t)=>{g((e=>{const s=[...e];return s[t]={...e[t],status:i.EFileStatus.UPLOADING},s}));const s=new FormData;s.append("sessionId",m?.sessionId||I.current||""),s.append("fileId",e.fileItem.id),s.append("slot",e.slot.toString()),"base64"===m.type?s.append("dataURL",e.dataURL):"multipart"===m.type&&s.append("file",e.rawFile,e.fileItem?.name);try{const a=await new i.AxiosApiClient("",void 0,void 0,!0).post(m.url,s,{headers:{"Content-Type":"base64"===m.type?"application/json":"multipart/form-data",...m.headers},onUploadProgress:e=>{const{loaded:i,total:s}=e;g((e=>{if(!e[t])return e;const a=[...e];return a[t]={...e[t],fileItem:{...e[t].fileItem,progress:i/s}},a}))}}),r=await w(e);g((e=>{if(!e[t])return e;const s=[...e];return s[t]={...e[t],fileItem:{...e[t].fileItem,progress:1,thumbnailImageDataUrl:r},fileUrl:a?.data?.fileUrl,status:i.EFileStatus.UPLOADED,uploadResponse:a},s}))}catch(i){throw E("upload-error",o,{fileId:e.fileItem.id,errorData:i?.response?.data}),i}},L=e=>{g((i=>i.filter(((i,t)=>t!==e))))},x=async e=>{if(u.maxSizeInKb>0&&a){const s=1024*u.maxSizeInKb;if(e.rawFile.size>s){const s=await i.FileHelper.getType(e.rawFile);if(t.includes(s.mime)){let t=await i.ImageHelper.compressImage(e.rawFile,{fileSize:u.maxSizeInKb});return t instanceof Blob&&(t=i.FileHelper.blobToFile(t,{name:e.rawFile.name,lastModified:e.rawFile.lastModified})),{...e,rawFile:t}}}}return e};return null};
2
+ //# sourceMappingURL=file-upload-manager.2b5e51c8.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"file-upload-manager.aebae412.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\tfileExtensionRule: IFileUploadValidationRule;\n\thideThumbnail?: boolean | undefined;\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 {\n\t\tcompressImages,\n\t\tfileTypeRule,\n\t\tfileExtensionRule,\n\t\thideThumbnail,\n\t\tid,\n\t\tmaxFileSizeRule,\n\t\tupload,\n\t\tuploadRule,\n\t\tvalue,\n\t} = 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 (hideThumbnail !== true && 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 fileTypeResult = validateFileType(fileType);\n\n\t\tif (fileTypeResult?.status < 0) {\n\t\t\treturn fileTypeResult;\n\t\t}\n\n\t\tif (fileTypeRule.fileType && fileExtensionRule.fileExtension) {\n\t\t\tconst fileExtensionResult = validateFileExtension(rawFile.name);\n\t\t\tif (fileExtensionResult?.status < 0) {\n\t\t\t\treturn { ...fileExtensionResult, fileType };\n\t\t\t}\n\t\t}\n\n\t\tconst fileSize = upload.type === \"base64\" ? FileHelper.getFilesizeFromBase64(dataURL) : rawFile.size;\n\t\tconst { errorMessage, status } = validateFileSize(fileSize);\n\t\tif (status < 0) {\n\t\t\treturn { errorMessage, fileType, status };\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\tconst validateFileType = (fileType: { mime: string; ext: string }) => {\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\treturn {};\n\t};\n\n\tconst validateFileExtension = (fileName: string) => {\n\t\tconst extensionFromFilename = fileName?.includes(\".\") ? fileName.split(\".\").pop().toLowerCase() : undefined;\n\n\t\tif (!extensionFromFilename || !fileExtensionRule?.fileExtension?.includes(extensionFromFilename)) {\n\t\t\treturn {\n\t\t\t\terrorMessage:\n\t\t\t\t\tfileExtensionRule.errorMessage ||\n\t\t\t\t\tERROR_MESSAGES.UPLOAD().FILE_EXTENSION(fileTypeRule.fileType || []),\n\t\t\t\tfileName,\n\t\t\t\tstatus: EFileStatus.ERROR_FORMAT,\n\t\t\t};\n\t\t}\n\t\treturn {};\n\t};\n\n\tconst validateFileSize = (fileSizeInKb: number) => {\n\t\tif (maxFileSizeRule.maxSizeInKb > 0) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (fileSizeInKb > maxSizeInB) {\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\tstatus: EFileStatus.ERROR_SIZE,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {};\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\n\t\t// rawFile may not be available because some use cases is not able to return dataURL / fileUrl due to security concerns\n\t\t// in such cases, we will rely on the uploadResponse for file info\n\t\tconst uploadData = fileToInject.uploadResponse?.[\"data\"] || fileToInject.uploadResponse;\n\t\tconst { errorMessage, fileType } = rawFile\n\t\t\t? await readFile({ ...fileToInject, rawFile })\n\t\t\t: validateFileType({\n\t\t\t\t\tmime: uploadData?.[\"mimeType\"],\n\t\t\t\t\text: uploadData?.[\"ext\"],\n\t\t\t });\n\n\t\tlet size = rawFile?.size || uploadData?.[\"fileSize\"] || 0;\n\t\tif (isNaN(size)) {\n\t\t\tsize = 0;\n\t\t}\n\t\tconst { errorMessage: filesizeErrorMessage } = validateFileSize(size);\n\n\t\tconst thumbnailImageDataUrl = rawFile ? await generateThumbnail(fileToInject, fileType?.mime) : undefined;\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: errorMessage || filesizeErrorMessage,\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 || fileToInject.rawFile.name\n\t\t\t\t\t),\n\t\t\t\t\tprogress: 1,\n\t\t\t\t\tsize,\n\t\t\t\t\ttype: fileType?.mime || uploadData?.[\"mimeType\"],\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","props","compressImages","fileTypeRule","fileExtensionRule","hideThumbnail","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","fileTypeResult","validateFileType","fileExtension","fileExtensionResult","validateFileExtension","fileSize","getFilesizeFromBase64","size","validateFileSize","ext","FILE_TYPE","ERROR_FORMAT","extensionFromFilename","split","pop","toLowerCase","FILE_EXTENSION","fileSizeInKb","maxSizeInKb","MAX_FILE_SIZE","ERROR_SIZE","fileToInject","INJECTING","blob","dataUrlToBlob","File","response","AxiosApiClient","responseType","get","mime","uploadData","isNaN","filesizeErrorMessage","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","maxSizeInB","fileOrBlob","compressImage","Blob","blobToFile","lastModified"],"mappings":"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"}
1
+ {"version":3,"file":"file-upload-manager.2b5e51c8.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\tfileExtensionRule: IFileUploadValidationRule;\n\thideThumbnail?: boolean | undefined;\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 {\n\t\tcompressImages,\n\t\tfileTypeRule,\n\t\tfileExtensionRule,\n\t\thideThumbnail,\n\t\tid,\n\t\tmaxFileSizeRule,\n\t\tupload,\n\t\tuploadRule,\n\t\tvalue,\n\t} = 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 (hideThumbnail !== true && 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 fileTypeResult = validateFileType(fileType);\n\n\t\tif (fileTypeResult?.status < 0) {\n\t\t\treturn fileTypeResult;\n\t\t}\n\n\t\tif (fileTypeRule.fileType && fileExtensionRule.fileExtension) {\n\t\t\tconst fileExtensionResult = validateFileExtension(rawFile.name);\n\t\t\tif (fileExtensionResult?.status < 0) {\n\t\t\t\treturn { ...fileExtensionResult, fileType };\n\t\t\t}\n\t\t}\n\n\t\tconst fileSize = upload.type === \"base64\" ? FileHelper.getFilesizeFromBase64(dataURL) : rawFile.size;\n\t\tconst { errorMessage, status } = validateFileSize(fileSize);\n\t\tif (status < 0) {\n\t\t\treturn { errorMessage, fileType, status };\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\tconst validateFileType = (fileType: { mime: string; ext: string }) => {\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\treturn {};\n\t};\n\n\tconst validateFileExtension = (fileName: string) => {\n\t\tconst extensionFromFilename = fileName?.includes(\".\") ? fileName.split(\".\").pop().toLowerCase() : undefined;\n\n\t\tif (!extensionFromFilename || !fileExtensionRule?.fileExtension?.includes(extensionFromFilename)) {\n\t\t\treturn {\n\t\t\t\terrorMessage:\n\t\t\t\t\tfileExtensionRule.errorMessage ||\n\t\t\t\t\tERROR_MESSAGES.UPLOAD().FILE_EXTENSION(fileTypeRule.fileType || []),\n\t\t\t\tfileName,\n\t\t\t\tstatus: EFileStatus.ERROR_FORMAT,\n\t\t\t};\n\t\t}\n\t\treturn {};\n\t};\n\n\tconst validateFileSize = (fileSizeInKb: number) => {\n\t\tif (maxFileSizeRule.maxSizeInKb > 0) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (fileSizeInKb > maxSizeInB) {\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\tstatus: EFileStatus.ERROR_SIZE,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {};\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\n\t\t// rawFile may not be available because some use cases is not able to return dataURL / fileUrl due to security concerns\n\t\t// in such cases, we will rely on the uploadResponse for file info\n\t\tconst uploadData = fileToInject.uploadResponse?.[\"data\"] || fileToInject.uploadResponse;\n\t\tconst { errorMessage, fileType } = rawFile\n\t\t\t? await readFile({ ...fileToInject, rawFile })\n\t\t\t: validateFileType({\n\t\t\t\t\tmime: uploadData?.[\"mimeType\"],\n\t\t\t\t\text: uploadData?.[\"ext\"],\n\t\t\t });\n\n\t\tlet size = rawFile?.size || uploadData?.[\"fileSize\"] || 0;\n\t\tif (isNaN(size)) {\n\t\t\tsize = 0;\n\t\t}\n\t\tconst { errorMessage: filesizeErrorMessage } = validateFileSize(size);\n\n\t\tconst thumbnailImageDataUrl = rawFile ? await generateThumbnail(fileToInject, fileType?.mime) : undefined;\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: errorMessage || filesizeErrorMessage,\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 || fileToInject.rawFile.name\n\t\t\t\t\t),\n\t\t\t\t\tprogress: 1,\n\t\t\t\t\tsize,\n\t\t\t\t\ttype: fileType?.mime || uploadData?.[\"mimeType\"],\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","props","compressImages","fileTypeRule","fileExtensionRule","hideThumbnail","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","fileTypeResult","validateFileType","fileExtension","fileExtensionResult","validateFileExtension","fileSize","getFilesizeFromBase64","size","validateFileSize","ext","FILE_TYPE","ERROR_FORMAT","extensionFromFilename","split","pop","toLowerCase","FILE_EXTENSION","fileSizeInKb","maxSizeInKb","MAX_FILE_SIZE","ERROR_SIZE","fileToInject","INJECTING","blob","dataUrlToBlob","File","response","AxiosApiClient","responseType","get","mime","uploadData","isNaN","filesizeErrorMessage","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","maxSizeInB","fileOrBlob","compressImage","Blob","blobToFile","lastModified"],"mappings":"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"}