@lifesg/web-frontend-engine 2.2.0 → 2.2.2

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 (44) hide show
  1. package/README.md +1 -1
  2. package/chunks/{file-upload-manager.faa055fa.js → file-upload-manager.581859a5.js} +2 -2
  3. package/chunks/{file-upload-manager.faa055fa.js.map → file-upload-manager.581859a5.js.map} +1 -1
  4. package/chunks/{index.2d28e824.js → index.8cc1cf41.js} +155 -129
  5. package/chunks/index.8cc1cf41.js.map +1 -0
  6. package/chunks/{index.ef942fcf.js → index.bba30c64.js} +2 -2
  7. package/chunks/{index.ef942fcf.js.map → index.bba30c64.js.map} +1 -1
  8. package/chunks/{index.fe54c734.js → index.d31714ac.js} +2 -2
  9. package/chunks/{index.fe54c734.js.map → index.d31714ac.js.map} +1 -1
  10. package/chunks/{location-modal.5e4e98fd.js → location-modal.60f7c5c4.js} +146 -100
  11. package/chunks/location-modal.60f7c5c4.js.map +1 -0
  12. package/cjs/chunks/{file-upload-manager.bc7599d2.js → file-upload-manager.75d19b87.js} +2 -2
  13. package/cjs/chunks/{file-upload-manager.bc7599d2.js.map → file-upload-manager.75d19b87.js.map} +1 -1
  14. package/cjs/chunks/{index.17761159.js → index.00d4458f.js} +155 -129
  15. package/cjs/chunks/index.00d4458f.js.map +1 -0
  16. package/cjs/chunks/{index.8d9d1609.js → index.260bcc27.js} +2 -2
  17. package/cjs/chunks/{index.8d9d1609.js.map → index.260bcc27.js.map} +1 -1
  18. package/cjs/chunks/{index.51cff881.js → index.b1899917.js} +2 -2
  19. package/cjs/chunks/{index.51cff881.js.map → index.b1899917.js.map} +1 -1
  20. package/cjs/chunks/{location-modal.ca4904e4.js → location-modal.ff55a907.js} +84 -38
  21. package/cjs/chunks/location-modal.ff55a907.js.map +1 -0
  22. package/cjs/index.js +1 -1
  23. package/components/fields/image-upload/image-input/image-input.d.ts +5 -0
  24. package/components/fields/image-upload/image-input/image-input.styles.d.ts +5 -0
  25. package/components/fields/image-upload/types.d.ts +7 -0
  26. package/components/fields/location-field/location-modal/location-modal.d.ts +1 -1
  27. package/components/fields/location-field/location-modal/location-modal.styles.d.ts +1 -1
  28. package/components/fields/location-field/location-modal/location-picker/legend/index.d.ts +1 -0
  29. package/components/fields/location-field/location-modal/location-picker/legend/legend.d.ts +8 -0
  30. package/components/fields/location-field/location-modal/location-picker/legend/legend.styles.d.ts +9 -0
  31. package/components/fields/location-field/location-modal/location-picker/location-picker.d.ts +1 -1
  32. package/components/fields/location-field/location-modal/location-picker/location-picker.styles.d.ts +3 -0
  33. package/components/fields/location-field/location-modal/location-picker/types.d.ts +2 -1
  34. package/components/fields/location-field/location-modal/types.d.ts +1 -1
  35. package/components/fields/location-field/types.d.ts +9 -0
  36. package/context-providers/yup/custom-conditions/html-safe.d.ts +1 -0
  37. package/context-providers/yup/custom-conditions/index.d.ts +1 -0
  38. package/context-providers/yup/types.d.ts +2 -1
  39. package/index.js +1 -1
  40. package/package.json +2 -2
  41. package/chunks/index.2d28e824.js.map +0 -1
  42. package/chunks/location-modal.5e4e98fd.js.map +0 -1
  43. package/cjs/chunks/index.17761159.js.map +0 -1
  44. package/cjs/chunks/location-modal.ca4904e4.js.map +0 -1
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),t=require("./index.17761159.js");require("react/jsx-runtime"),require("@lifesg/react-design-system/theme"),require("styled-components"),require("@lifesg/react-design-system/typography"),require("@lifesg/react-design-system/button"),require("@lifesg/react-design-system/modal"),require("@lifesg/react-design-system/markup"),require("react-dom/server"),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");exports.default=a=>{const{accepts:s,compress:r,crop:i,dimensions:n,editImage:u,id:l,maxSizeInKb:c,outputType:o,upload:g,filenameMatches:m,filenameMatchesErrorMessage:d,value:E}=a,{images:f,setImages:p,setErrorCount:R,setCurrentFileIds:I}=e.useContext(t.ImageContext),h=t.usePrevious(f),y=t.usePrevious(E),{setValue:S}=t.useFormContext(),q=e.useRef(),w=e.useRef(0),{dispatchFieldEvent:D,addFieldEventListener:O,removeFieldEventListener:U}=t.useFieldEvent();e.useEffect((()=>{const e=e=>{p((t=>{const a=t.findIndex((t=>t.id===e.detail.id)),s={...t[a]};s.status=e.detail.updatedStatus,s.customErrorMessage=e.detail.errorMessage;const r=[...t];return r.splice(a,1,s),r}))};return O("update-image-status",l,e),()=>U("update-image-status",l,e)}),[O,l,U,p]),e.useEffect((()=>{q.current=t.generateRandomId()}),[]),e.useEffect((()=>{f.forEach(((e,a)=>{const i=h?.[a];if(e.status!==i?.status||e.dataURL!==i.dataURL)switch(e.status){case t.EImageStatus.INJECTED:t.FileHelper.dataUrlToBlob(e.dataURL).then((s=>{p((r=>{const i=[...r];return i[a]={...e,file:new File([s],e.name),status:t.EImageStatus.NONE},i}))})).catch((()=>{p((e=>e.filter(((e,t)=>t!==a))))}));break;case t.EImageStatus.NONE:if(m){const s=L(m);if(s&&!s.test(e.name)){p((s=>{const r=[...s];return r[a]={...e,status:t.EImageStatus.ERROR_FILENAME,customErrorMessage:d},r}));break}}t.FileHelper.getType(e.file).then((i=>{const n=i.mime;n&&s.map(t.FileHelper.fileExtensionToMimeType).includes(n)?(p((s=>{const r=[...s];return r[a]={...e,name:t.FileHelper.deduplicateFileName(f.map((({name:e})=>e)),a,t.FileHelper.sanitizeFileName(e.name)),type:n,status:"schema"!==e.addedFrom?e.status:t.EImageStatus.UPLOADED},r})),"schema"!==e.addedFrom&&(r?H(a,e):T(a,e))):p((s=>{const r=[...s];return r[a]={...e,status:t.EImageStatus.ERROR_FORMAT},r}))}));break;case t.EImageStatus.TO_RECOMPRESS:M(a,e);break;case t.EImageStatus.COMPRESSED:case t.EImageStatus.CONVERTED:case t.EImageStatus.RECOMPRESSED:if(!u){const s=!D("upload-ready",l,{imageData:e});p((e=>{const r=[...e];return r[a]={...r[a],status:s?t.EImageStatus.PENDING:t.EImageStatus.UPLOAD_READY},r}))}break;case t.EImageStatus.UPLOAD_READY:v(a,e);break;case t.EImageStatus.TO_DELETE:p((e=>e.filter((({status:e})=>e!==t.EImageStatus.TO_DELETE))));break;case t.EImageStatus.UPLOADED:D("uploaded",l,{imageData:e})}}))}),[f.map((({status:e})=>e)).join(","),f.map((({dataURL:e})=>e)).join(",")]),e.useEffect((()=>{let e=0;f.forEach((a=>{(a.type&&!s.map(t.FileHelper.fileExtensionToMimeType).includes(a.type)||[t.EImageStatus.ERROR_GENERIC,t.EImageStatus.ERROR_SIZE,t.EImageStatus.ERROR_FILENAME].includes(a.status))&&e++})),R((t=>Math.max(0,t+e-w.current))),w.current=e;const a=f.filter((({status:e})=>e===t.EImageStatus.UPLOADED||e===t.EImageStatus.ERROR_CUSTOM_MUTED)),r=a.filter((({addedFrom:e})=>"schema"!==e)),i=f.filter((({status:e})=>e===t.EImageStatus.TO_DELETE)).length>0,n=r.length>0,u=n||i;I(a.map((({id:e})=>e))),S(l,a.map((({id:e,dataURL:t,drawingDataURL:a,name:s,metadata:r,uploadResponse:i})=>({fileId:e,fileName:s,dataURL:a||t,metadata:r,uploadResponse:i}))),{shouldDirty:u,shouldTouch:n})}),[s,l,f,R,S]),e.useEffect((()=>{void 0!==y&&void 0===E&&f.length&&p([])}),[void 0===y,void 0===E,f.length]);const F=(e,t)=>{let a=n.width/e;return t*a>n.height&&(a=n.height/t),a},L=e=>{try{const t=e.match(/^\/(.+)\/([gimsuy]*)$/);return t?new RegExp(t[1],t[2]||""):new RegExp(e)}catch{return}},T=async(e,a)=>{try{const s=await t.ImageHelper.convertBlob(a.file,t.FileHelper.fileExtensionToMimeType(o)),r=t.FileHelper.getFilesizeFromBase64(s);if(c&&r>1024*c)p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_SIZE},s}));else{const r=await t.ImageHelper.getMetadata(a.file);p((a=>{const i=[...a];return i[e]={...a[e],dataURL:s,metadata:r,status:t.EImageStatus.CONVERTED},i}))}}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}},H=async(e,a)=>{try{const s=await t.ImageHelper.convertBlob(a.file,t.FileHelper.fileExtensionToMimeType(o)),r=await t.ImageHelper.dataUrlToImage(s),u={w:r.naturalWidth,h:r.naturalHeight};let l;if(i)l=await t.ImageHelper.resampleImage(r,{width:n.width,height:n.height,crop:!0});else{const e=F(u.w,u.h);l=await t.ImageHelper.resampleImage(r,{scale:e})}if(c&&(l=await t.ImageHelper.compressImage(l,{fileSize:c})),c&&l.size>1024*c)p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_SIZE},s}));else{const s=await t.ImageHelper.getMetadata(a.file),r=await t.FileHelper.fileToDataUrl(l);p((a=>{const i=[...a];return i[e]={...a[e],dataURL:r,metadata:s,status:t.EImageStatus.COMPRESSED},i}))}}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}},M=async(e,a)=>{if(a.drawingDataURL)try{const s=await t.ImageHelper.dataUrlToImage(a.drawingDataURL),r={w:s.naturalWidth,h:s.naturalHeight};let u;if(i)u=await t.ImageHelper.resampleImage(s,{width:n.width,height:n.height,crop:!0});else{const e=F(r.w,r.h);u=await t.ImageHelper.resampleImage(s,{scale:e})}if(u=await t.ImageHelper.compressImage(u,{fileSize:c}),u.size>1024*c){const a=[...f];a[e]={...f[e],status:t.EImageStatus.ERROR_SIZE},p(a)}else{const a=await t.FileHelper.fileToDataUrl(u),s=[...f];s[e]={...f[e],drawingDataURL:a,status:t.EImageStatus.RECOMPRESSED},p(s)}}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}},v=async(e,a)=>{try{let s;if(p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.UPLOADING},s})),g?.method&&g?.url){const r=new FormData;r.append("dataURL",a.drawingDataURL||a.dataURL||""),r.append("sessionId",g?.sessionId||q.current||""),r.append("slot",`${a.slot}`),s=await new t.AxiosApiClient("",void 0,void 0,!0)[g.method](g.url,r,{onUploadProgress:t=>{const{loaded:a,total:s}=t,r=Math.floor(100*a/s);p((t=>{const a=[...t];return a[e]={...t[e],uploadProgress:r},a}))}})}p((a=>{const r=[...a];return r[e]={...a[e],uploadResponse:s,status:t.EImageStatus.UPLOADED},r}))}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}};return null};
2
- //# sourceMappingURL=index.8d9d1609.js.map
1
+ "use strict";var e=require("react"),t=require("./index.00d4458f.js");require("react/jsx-runtime"),require("@lifesg/react-design-system/theme"),require("styled-components"),require("@lifesg/react-design-system/typography"),require("@lifesg/react-design-system/button"),require("@lifesg/react-design-system/modal"),require("@lifesg/react-design-system/markup"),require("react-dom/server"),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");exports.default=a=>{const{accepts:s,compress:r,crop:i,dimensions:n,editImage:u,id:l,maxSizeInKb:c,outputType:o,upload:g,filenameMatches:m,filenameMatchesErrorMessage:d,value:E}=a,{images:f,setImages:p,setErrorCount:R,setCurrentFileIds:I}=e.useContext(t.ImageContext),h=t.usePrevious(f),y=t.usePrevious(E),{setValue:S}=t.useFormContext(),q=e.useRef(),w=e.useRef(0),{dispatchFieldEvent:D,addFieldEventListener:O,removeFieldEventListener:U}=t.useFieldEvent();e.useEffect((()=>{const e=e=>{p((t=>{const a=t.findIndex((t=>t.id===e.detail.id)),s={...t[a]};s.status=e.detail.updatedStatus,s.customErrorMessage=e.detail.errorMessage;const r=[...t];return r.splice(a,1,s),r}))};return O("update-image-status",l,e),()=>U("update-image-status",l,e)}),[O,l,U,p]),e.useEffect((()=>{q.current=t.generateRandomId()}),[]),e.useEffect((()=>{f.forEach(((e,a)=>{const i=h?.[a];if(e.status!==i?.status||e.dataURL!==i.dataURL)switch(e.status){case t.EImageStatus.INJECTED:t.FileHelper.dataUrlToBlob(e.dataURL).then((s=>{p((r=>{const i=[...r];return i[a]={...e,file:new File([s],e.name),status:t.EImageStatus.NONE},i}))})).catch((()=>{p((e=>e.filter(((e,t)=>t!==a))))}));break;case t.EImageStatus.NONE:if(m){const s=L(m);if(s&&!s.test(e.name)){p((s=>{const r=[...s];return r[a]={...e,status:t.EImageStatus.ERROR_FILENAME,customErrorMessage:d},r}));break}}t.FileHelper.getType(e.file).then((i=>{const n=i.mime;n&&s.map(t.FileHelper.fileExtensionToMimeType).includes(n)?(p((s=>{const r=[...s];return r[a]={...e,name:t.FileHelper.deduplicateFileName(f.map((({name:e})=>e)),a,t.FileHelper.sanitizeFileName(e.name)),type:n,status:"schema"!==e.addedFrom?e.status:t.EImageStatus.UPLOADED},r})),"schema"!==e.addedFrom&&(r?H(a,e):T(a,e))):p((s=>{const r=[...s];return r[a]={...e,status:t.EImageStatus.ERROR_FORMAT},r}))}));break;case t.EImageStatus.TO_RECOMPRESS:M(a,e);break;case t.EImageStatus.COMPRESSED:case t.EImageStatus.CONVERTED:case t.EImageStatus.RECOMPRESSED:if(!u){const s=!D("upload-ready",l,{imageData:e});p((e=>{const r=[...e];return r[a]={...r[a],status:s?t.EImageStatus.PENDING:t.EImageStatus.UPLOAD_READY},r}))}break;case t.EImageStatus.UPLOAD_READY:v(a,e);break;case t.EImageStatus.TO_DELETE:p((e=>e.filter((({status:e})=>e!==t.EImageStatus.TO_DELETE))));break;case t.EImageStatus.UPLOADED:D("uploaded",l,{imageData:e})}}))}),[f.map((({status:e})=>e)).join(","),f.map((({dataURL:e})=>e)).join(",")]),e.useEffect((()=>{let e=0;f.forEach((a=>{(a.type&&!s.map(t.FileHelper.fileExtensionToMimeType).includes(a.type)||[t.EImageStatus.ERROR_GENERIC,t.EImageStatus.ERROR_SIZE,t.EImageStatus.ERROR_FILENAME].includes(a.status))&&e++})),R((t=>Math.max(0,t+e-w.current))),w.current=e;const a=f.filter((({status:e})=>e===t.EImageStatus.UPLOADED||e===t.EImageStatus.ERROR_CUSTOM_MUTED)),r=a.filter((({addedFrom:e})=>"schema"!==e)),i=f.filter((({status:e})=>e===t.EImageStatus.TO_DELETE)).length>0,n=r.length>0,u=n||i;I(a.map((({id:e})=>e))),S(l,a.map((({id:e,dataURL:t,drawingDataURL:a,name:s,metadata:r,uploadResponse:i})=>({fileId:e,fileName:s,dataURL:a||t,metadata:r,uploadResponse:i}))),{shouldDirty:u,shouldTouch:n})}),[s,l,f,R,S]),e.useEffect((()=>{void 0!==y&&void 0===E&&f.length&&p([])}),[void 0===y,void 0===E,f.length]);const F=(e,t)=>{let a=n.width/e;return t*a>n.height&&(a=n.height/t),a},L=e=>{try{const t=e.match(/^\/(.+)\/([gimsuy]*)$/);return t?new RegExp(t[1],t[2]||""):new RegExp(e)}catch{return}},T=async(e,a)=>{try{const s=await t.ImageHelper.convertBlob(a.file,t.FileHelper.fileExtensionToMimeType(o)),r=t.FileHelper.getFilesizeFromBase64(s);if(c&&r>1024*c)p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_SIZE},s}));else{const r=await t.ImageHelper.getMetadata(a.file);p((a=>{const i=[...a];return i[e]={...a[e],dataURL:s,metadata:r,status:t.EImageStatus.CONVERTED},i}))}}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}},H=async(e,a)=>{try{const s=await t.ImageHelper.convertBlob(a.file,t.FileHelper.fileExtensionToMimeType(o)),r=await t.ImageHelper.dataUrlToImage(s),u={w:r.naturalWidth,h:r.naturalHeight};let l;if(i)l=await t.ImageHelper.resampleImage(r,{width:n.width,height:n.height,crop:!0});else{const e=F(u.w,u.h);l=await t.ImageHelper.resampleImage(r,{scale:e})}if(c&&(l=await t.ImageHelper.compressImage(l,{fileSize:c})),c&&l.size>1024*c)p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_SIZE},s}));else{const s=await t.ImageHelper.getMetadata(a.file),r=await t.FileHelper.fileToDataUrl(l);p((a=>{const i=[...a];return i[e]={...a[e],dataURL:r,metadata:s,status:t.EImageStatus.COMPRESSED},i}))}}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}},M=async(e,a)=>{if(a.drawingDataURL)try{const s=await t.ImageHelper.dataUrlToImage(a.drawingDataURL),r={w:s.naturalWidth,h:s.naturalHeight};let u;if(i)u=await t.ImageHelper.resampleImage(s,{width:n.width,height:n.height,crop:!0});else{const e=F(r.w,r.h);u=await t.ImageHelper.resampleImage(s,{scale:e})}if(u=await t.ImageHelper.compressImage(u,{fileSize:c}),u.size>1024*c){const a=[...f];a[e]={...f[e],status:t.EImageStatus.ERROR_SIZE},p(a)}else{const a=await t.FileHelper.fileToDataUrl(u),s=[...f];s[e]={...f[e],drawingDataURL:a,status:t.EImageStatus.RECOMPRESSED},p(s)}}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}},v=async(e,a)=>{try{let s;if(p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.UPLOADING},s})),g?.method&&g?.url){const r=new FormData;r.append("dataURL",a.drawingDataURL||a.dataURL||""),r.append("sessionId",g?.sessionId||q.current||""),r.append("slot",`${a.slot}`),s=await new t.AxiosApiClient("",void 0,void 0,!0)[g.method](g.url,r,{onUploadProgress:t=>{const{loaded:a,total:s}=t,r=Math.floor(100*a/s);p((t=>{const a=[...t];return a[e]={...t[e],uploadProgress:r},a}))}})}p((a=>{const r=[...a];return r[e]={...a[e],uploadResponse:s,status:t.EImageStatus.UPLOADED},r}))}catch(a){p((a=>{const s=[...a];return s[e]={...a[e],status:t.EImageStatus.ERROR_GENERIC},s}))}};return null};
2
+ //# sourceMappingURL=index.260bcc27.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.8d9d1609.js","sources":["../../../src/components/fields/image-upload/image-manager/image-manager.ts"],"sourcesContent":["import { 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 { ImageContext } from \"../image-context\";\nimport {\n\tEImageStatus,\n\tIImage,\n\tISharedImageProps,\n\tIUpdateImageStatus,\n\tTImageUploadOutputFileType,\n\tTUploadMethod,\n} from \"../types\";\n\ninterface IProps extends Omit<ISharedImageProps, \"maxFiles\"> {\n\teditImage: boolean;\n\tcompress: boolean;\n\tcrop: boolean;\n\tdimensions: { width: number; height: number };\n\toutputType: TImageUploadOutputFileType;\n\tupload?: {\n\t\tmethod: TUploadMethod;\n\t\turl: string;\n\t\tsessionId?: string | undefined;\n\t};\n\tfilenameMatches?: string | undefined;\n\tfilenameMatchesErrorMessage?: string | undefined;\n\tvalue: any;\n}\n\n/**\n * manages selected images by listening to images from context provider\n * rename / compress / upload\n */\nexport const ImageManager = (props: IProps) => {\n\t// =============================================================================\n\t// CONST, STATE, REFS\n\t// =============================================================================\n\tconst {\n\t\taccepts,\n\t\tcompress,\n\t\tcrop,\n\t\tdimensions,\n\t\teditImage,\n\t\tid,\n\t\tmaxSizeInKb,\n\t\toutputType,\n\t\tupload,\n\t\tfilenameMatches,\n\t\tfilenameMatchesErrorMessage,\n\t\tvalue,\n\t} = props;\n\tconst { images, setImages, setErrorCount, setCurrentFileIds } = useContext(ImageContext);\n\tconst previousImages = usePrevious(images);\n\tconst previousValue = usePrevious(value);\n\tconst { setValue } = useFormContext();\n\tconst sessionId = useRef<string>();\n\tconst managerErrorCount = useRef(0);\n\n\tconst { dispatchFieldEvent, addFieldEventListener, removeFieldEventListener } = useFieldEvent();\n\n\t// =============================================================================\n\t// EFFECTS\n\t// =============================================================================\n\tuseEffect(() => {\n\t\tconst handleUpdateImageStatus = (e: CustomEvent<IUpdateImageStatus>) => {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst imageIndex = prev.findIndex((image) => image.id === e.detail.id);\n\t\t\t\tconst updatedImage = { ...prev[imageIndex] };\n\t\t\t\tupdatedImage.status = e.detail.updatedStatus;\n\t\t\t\tupdatedImage.customErrorMessage = e.detail.errorMessage;\n\n\t\t\t\tconst newImages = [...prev];\n\t\t\t\tnewImages.splice(imageIndex, 1, updatedImage);\n\t\t\t\treturn newImages;\n\t\t\t});\n\t\t};\n\n\t\taddFieldEventListener(\"update-image-status\", id, handleUpdateImageStatus);\n\t\treturn () => removeFieldEventListener(\"update-image-status\", id, handleUpdateImageStatus);\n\t}, [addFieldEventListener, id, removeFieldEventListener, setImages]);\n\n\t// generate pseudo-random session id\n\tuseEffect(() => {\n\t\tsessionId.current = generateRandomId();\n\t}, []);\n\n\tuseEffect(() => {\n\t\timages.forEach((image, index) => {\n\t\t\tconst previousFile = previousImages?.[index];\n\t\t\tif (image.status !== previousFile?.status || image.dataURL !== previousFile.dataURL) {\n\t\t\t\tswitch (image.status) {\n\t\t\t\t\tcase EImageStatus.INJECTED:\n\t\t\t\t\t\tFileHelper.dataUrlToBlob(image.dataURL)\n\t\t\t\t\t\t\t.then((blob) => {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tfile: new File([blob], image.name),\n\t\t\t\t\t\t\t\t\t\tstatus: EImageStatus.NONE,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\tsetImages((prev) => prev.filter((prev, i) => i !== index));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.NONE:\n\t\t\t\t\t\tif (filenameMatches) {\n\t\t\t\t\t\t\tconst pattern = resolveMatchesPattern(filenameMatches);\n\t\t\t\t\t\t\tif (pattern && !pattern.test(image.name)) {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tstatus: EImageStatus.ERROR_FILENAME,\n\t\t\t\t\t\t\t\t\t\tcustomErrorMessage: filenameMatchesErrorMessage,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFileHelper.getType(image.file).then((fileType) => {\n\t\t\t\t\t\t\tconst mimeType = fileType.mime;\n\t\t\t\t\t\t\tif (mimeType && accepts.map(FileHelper.fileExtensionToMimeType).includes(mimeType)) {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\t\t\t\t\t\timages.map(({ name }) => name),\n\t\t\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\t\t\tFileHelper.sanitizeFileName(image.name)\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\ttype: mimeType,\n\t\t\t\t\t\t\t\t\t\tstatus: image.addedFrom !== \"schema\" ? image.status : EImageStatus.UPLOADED,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (image.addedFrom !== \"schema\") {\n\t\t\t\t\t\t\t\t\tcompress ? compressImage(index, image) : convertImage(index, image);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tstatus: EImageStatus.ERROR_FORMAT,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.TO_RECOMPRESS:\n\t\t\t\t\t\trecompressImage(index, image);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.COMPRESSED:\n\t\t\t\t\tcase EImageStatus.CONVERTED:\n\t\t\t\t\tcase EImageStatus.RECOMPRESSED:\n\t\t\t\t\t\tif (!editImage) {\n\t\t\t\t\t\t\tconst shouldPreventDefault = !dispatchFieldEvent(\"upload-ready\", id, { imageData: image });\n\n\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t...updatedImages[index],\n\t\t\t\t\t\t\t\t\tstatus: shouldPreventDefault ? EImageStatus.PENDING : EImageStatus.UPLOAD_READY,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.UPLOAD_READY:\n\t\t\t\t\t\tuploadImage(index, image);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.TO_DELETE:\n\t\t\t\t\t\tsetImages((prev) => prev.filter(({ status }) => status !== EImageStatus.TO_DELETE));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.UPLOADED:\n\t\t\t\t\t\tdispatchFieldEvent(\"uploaded\", id, { imageData: image });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [images.map(({ status }) => status).join(\",\"), images.map(({ dataURL }) => dataURL).join(\",\")]);\n\n\t// track / update errors and values\n\tuseEffect(() => {\n\t\tlet updatedManagerErrorCount = 0;\n\t\timages.forEach((image) => {\n\t\t\tif (\n\t\t\t\t(image.type && !accepts.map(FileHelper.fileExtensionToMimeType).includes(image.type)) ||\n\t\t\t\t[EImageStatus.ERROR_GENERIC, EImageStatus.ERROR_SIZE, EImageStatus.ERROR_FILENAME].includes(\n\t\t\t\t\timage.status\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tupdatedManagerErrorCount++;\n\t\t\t}\n\t\t});\n\t\tsetErrorCount((prev) => Math.max(0, prev + updatedManagerErrorCount - managerErrorCount.current));\n\t\tmanagerErrorCount.current = updatedManagerErrorCount;\n\n\t\tconst uploadedImages = images.filter(\n\t\t\t({ status }) => status === EImageStatus.UPLOADED || status === EImageStatus.ERROR_CUSTOM_MUTED\n\t\t);\n\t\tconst notPrefilledImages = uploadedImages.filter(({ addedFrom }) => addedFrom !== \"schema\");\n\t\tconst gotDeleteImages = images.filter(({ status }) => status === EImageStatus.TO_DELETE).length > 0;\n\n\t\t/**\n\t\t * should dirty if\n\t\t * - it is dirty in the first place\n\t\t * - there are non-prefilled images\n\t\t * - user deleted image (differentiated from reset)\n\t\t */\n\t\tconst hasNotPrefilledImages = notPrefilledImages.length > 0;\n\t\tconst shouldDirty = hasNotPrefilledImages || gotDeleteImages;\n\n\t\tsetCurrentFileIds(uploadedImages.map(({ id }) => id));\n\n\t\tsetValue(\n\t\t\tid,\n\t\t\tuploadedImages.map(({ id, dataURL, drawingDataURL, name, metadata, uploadResponse }) => ({\n\t\t\t\tfileId: id,\n\t\t\t\tfileName: name,\n\t\t\t\tdataURL: drawingDataURL || dataURL,\n\t\t\t\tmetadata,\n\t\t\t\tuploadResponse,\n\t\t\t})),\n\t\t\t{ shouldDirty, shouldTouch: hasNotPrefilledImages }\n\t\t);\n\t}, [accepts, id, images, setErrorCount, setValue]);\n\n\tuseEffect(() => {\n\t\tif (previousValue !== undefined && value === undefined && images.length) {\n\t\t\tsetImages([]);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [previousValue === undefined, value === undefined, images.length]);\n\n\t// =============================================================================\n\t// HELPER FUNCTIONS\n\t// =============================================================================\n\tconst getScale = (origWidth: number, origHeight: number): number => {\n\t\tlet scale = dimensions.width / origWidth;\n\t\tif (origHeight * scale > dimensions.height) {\n\t\t\tscale = dimensions.height / origHeight;\n\t\t}\n\t\treturn scale;\n\t};\n\n\t/**\n\t * Converts a matches string (e.g. \"/^abc$/i\" or \"^abc$\") to a RegExp.\n\t * Returns undefined if the string is invalid.\n\t */\n\tconst resolveMatchesPattern = (matches: string): RegExp | undefined => {\n\t\ttry {\n\t\t\tconst parsed = matches.match(/^\\/(.+)\\/([gimsuy]*)$/);\n\t\t\treturn parsed ? new RegExp(parsed[1], parsed[2] || \"\") : new RegExp(matches);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t};\n\n\tconst convertImage = async (index: number, image: IImage) => {\n\t\ttry {\n\t\t\tconst dataURL = await ImageHelper.convertBlob(image.file, FileHelper.fileExtensionToMimeType(outputType));\n\t\t\tconst filesize = FileHelper.getFilesizeFromBase64(dataURL);\n\n\t\t\tif (maxSizeInKb && filesize > maxSizeInKb * 1024) {\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_SIZE,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst metadata = await ImageHelper.getMetadata(image.file);\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tdataURL,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\tstatus: EImageStatus.CONVERTED,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t}\n\t};\n\n\tconst compressImage = async (index: number, imageToCompress: IImage) => {\n\t\ttry {\n\t\t\tconst dataURL = await ImageHelper.convertBlob(\n\t\t\t\timageToCompress.file,\n\t\t\t\tFileHelper.fileExtensionToMimeType(outputType)\n\t\t\t);\n\t\t\tconst image = await ImageHelper.dataUrlToImage(dataURL);\n\t\t\tconst origDim = { w: image.naturalWidth, h: image.naturalHeight };\n\t\t\tlet compressed: Blob;\n\t\t\tif (crop) {\n\t\t\t\tcompressed = await ImageHelper.resampleImage(image, {\n\t\t\t\t\twidth: dimensions.width,\n\t\t\t\t\theight: dimensions.height,\n\t\t\t\t\tcrop: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\t\tcompressed = await ImageHelper.resampleImage(image, { scale });\n\t\t\t}\n\t\t\tif (maxSizeInKb) {\n\t\t\t\tcompressed = (await ImageHelper.compressImage(compressed, {\n\t\t\t\t\tfileSize: maxSizeInKb,\n\t\t\t\t})) as File;\n\t\t\t}\n\n\t\t\tif (maxSizeInKb && compressed.size > maxSizeInKb * 1024) {\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_SIZE,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst metadata = await ImageHelper.getMetadata(imageToCompress.file);\n\t\t\t\tconst dataURL = await FileHelper.fileToDataUrl(compressed);\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tdataURL,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\tstatus: EImageStatus.COMPRESSED,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t}\n\t};\n\n\tconst recompressImage = async (index: number, imageToCompress: IImage) => {\n\t\tif (imageToCompress.drawingDataURL) {\n\t\t\ttry {\n\t\t\t\tconst image = await ImageHelper.dataUrlToImage(imageToCompress.drawingDataURL);\n\t\t\t\tconst origDim = { w: image.naturalWidth, h: image.naturalHeight };\n\t\t\t\tlet scaledFile: Blob;\n\t\t\t\tif (crop) {\n\t\t\t\t\tscaledFile = await ImageHelper.resampleImage(image, {\n\t\t\t\t\t\twidth: dimensions.width,\n\t\t\t\t\t\theight: dimensions.height,\n\t\t\t\t\t\tcrop: true,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\t\t\tscaledFile = await ImageHelper.resampleImage(image, { scale });\n\t\t\t\t}\n\t\t\t\tscaledFile = (await ImageHelper.compressImage(scaledFile, { fileSize: maxSizeInKb })) as File;\n\n\t\t\t\tif (scaledFile.size > maxSizeInKb * 1024) {\n\t\t\t\t\tconst updatedImages = [...images];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...images[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_SIZE,\n\t\t\t\t\t};\n\t\t\t\t\tsetImages(updatedImages);\n\t\t\t\t} else {\n\t\t\t\t\tconst dataURL = await FileHelper.fileToDataUrl(scaledFile);\n\t\t\t\t\tconst updatedImages = [...images];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...images[index],\n\t\t\t\t\t\tdrawingDataURL: dataURL,\n\t\t\t\t\t\tstatus: EImageStatus.RECOMPRESSED,\n\t\t\t\t\t};\n\t\t\t\t\tsetImages(updatedImages);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\tconst uploadImage = async (index: number, iFile: IImage) => {\n\t\ttry {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.UPLOADING,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\n\t\t\tlet response: unknown;\n\t\t\tif (upload?.method && upload?.url) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append(\"dataURL\", iFile.drawingDataURL || iFile.dataURL || \"\");\n\t\t\t\tformData.append(\"sessionId\", upload?.sessionId || sessionId.current || \"\");\n\t\t\t\tformData.append(\"slot\", `${iFile.slot}`);\n\t\t\t\tresponse = await new AxiosApiClient(\"\", undefined, undefined, true)[upload.method](\n\t\t\t\t\tupload.url,\n\t\t\t\t\tformData,\n\t\t\t\t\t{\n\t\t\t\t\t\tonUploadProgress: (progressEvent) => {\n\t\t\t\t\t\t\tconst { loaded, total } = progressEvent;\n\t\t\t\t\t\t\tconst percent = Math.floor((loaded * 100) / total);\n\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\t\t\t\tuploadProgress: percent,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tuploadResponse: response,\n\t\t\t\t\tstatus: EImageStatus.UPLOADED,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t}\n\t};\n\n\treturn null;\n};\n"],"names":["props","accepts","compress","crop","dimensions","editImage","id","maxSizeInKb","outputType","upload","filenameMatches","filenameMatchesErrorMessage","value","images","setImages","setErrorCount","setCurrentFileIds","useContext","ImageContext","previousImages","usePrevious","previousValue","setValue","useFormContext","sessionId","useRef","managerErrorCount","dispatchFieldEvent","addFieldEventListener","removeFieldEventListener","useFieldEvent","useEffect","handleUpdateImageStatus","e","prev","imageIndex","findIndex","image","detail","updatedImage","status","updatedStatus","customErrorMessage","errorMessage","newImages","splice","current","generateRandomId","forEach","index","previousFile","dataURL","EImageStatus","INJECTED","FileHelper","dataUrlToBlob","then","blob","updatedImages","file","File","name","NONE","catch","filter","i","pattern","resolveMatchesPattern","test","ERROR_FILENAME","getType","fileType","mimeType","mime","map","fileExtensionToMimeType","includes","deduplicateFileName","sanitizeFileName","type","addedFrom","UPLOADED","compressImage","convertImage","ERROR_FORMAT","TO_RECOMPRESS","recompressImage","COMPRESSED","CONVERTED","RECOMPRESSED","shouldPreventDefault","imageData","PENDING","UPLOAD_READY","uploadImage","TO_DELETE","join","updatedManagerErrorCount","ERROR_GENERIC","ERROR_SIZE","Math","max","uploadedImages","ERROR_CUSTOM_MUTED","notPrefilledImages","gotDeleteImages","length","hasNotPrefilledImages","shouldDirty","drawingDataURL","metadata","uploadResponse","fileId","fileName","shouldTouch","undefined","getScale","origWidth","origHeight","scale","width","height","matches","parsed","match","RegExp","async","ImageHelper","convertBlob","filesize","getFilesizeFromBase64","getMetadata","imageToCompress","dataUrlToImage","origDim","w","naturalWidth","h","naturalHeight","compressed","resampleImage","fileSize","size","fileToDataUrl","scaledFile","iFile","response","UPLOADING","method","url","formData","FormData","append","slot","AxiosApiClient","onUploadProgress","progressEvent","loaded","total","percent","floor","uploadProgress","err"],"mappings":"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"}
1
+ {"version":3,"file":"index.260bcc27.js","sources":["../../../src/components/fields/image-upload/image-manager/image-manager.ts"],"sourcesContent":["import { 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 { ImageContext } from \"../image-context\";\nimport {\n\tEImageStatus,\n\tIImage,\n\tISharedImageProps,\n\tIUpdateImageStatus,\n\tTImageUploadOutputFileType,\n\tTUploadMethod,\n} from \"../types\";\n\ninterface IProps extends Omit<ISharedImageProps, \"maxFiles\"> {\n\teditImage: boolean;\n\tcompress: boolean;\n\tcrop: boolean;\n\tdimensions: { width: number; height: number };\n\toutputType: TImageUploadOutputFileType;\n\tupload?: {\n\t\tmethod: TUploadMethod;\n\t\turl: string;\n\t\tsessionId?: string | undefined;\n\t};\n\tfilenameMatches?: string | undefined;\n\tfilenameMatchesErrorMessage?: string | undefined;\n\tvalue: any;\n}\n\n/**\n * manages selected images by listening to images from context provider\n * rename / compress / upload\n */\nexport const ImageManager = (props: IProps) => {\n\t// =============================================================================\n\t// CONST, STATE, REFS\n\t// =============================================================================\n\tconst {\n\t\taccepts,\n\t\tcompress,\n\t\tcrop,\n\t\tdimensions,\n\t\teditImage,\n\t\tid,\n\t\tmaxSizeInKb,\n\t\toutputType,\n\t\tupload,\n\t\tfilenameMatches,\n\t\tfilenameMatchesErrorMessage,\n\t\tvalue,\n\t} = props;\n\tconst { images, setImages, setErrorCount, setCurrentFileIds } = useContext(ImageContext);\n\tconst previousImages = usePrevious(images);\n\tconst previousValue = usePrevious(value);\n\tconst { setValue } = useFormContext();\n\tconst sessionId = useRef<string>();\n\tconst managerErrorCount = useRef(0);\n\n\tconst { dispatchFieldEvent, addFieldEventListener, removeFieldEventListener } = useFieldEvent();\n\n\t// =============================================================================\n\t// EFFECTS\n\t// =============================================================================\n\tuseEffect(() => {\n\t\tconst handleUpdateImageStatus = (e: CustomEvent<IUpdateImageStatus>) => {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst imageIndex = prev.findIndex((image) => image.id === e.detail.id);\n\t\t\t\tconst updatedImage = { ...prev[imageIndex] };\n\t\t\t\tupdatedImage.status = e.detail.updatedStatus;\n\t\t\t\tupdatedImage.customErrorMessage = e.detail.errorMessage;\n\n\t\t\t\tconst newImages = [...prev];\n\t\t\t\tnewImages.splice(imageIndex, 1, updatedImage);\n\t\t\t\treturn newImages;\n\t\t\t});\n\t\t};\n\n\t\taddFieldEventListener(\"update-image-status\", id, handleUpdateImageStatus);\n\t\treturn () => removeFieldEventListener(\"update-image-status\", id, handleUpdateImageStatus);\n\t}, [addFieldEventListener, id, removeFieldEventListener, setImages]);\n\n\t// generate pseudo-random session id\n\tuseEffect(() => {\n\t\tsessionId.current = generateRandomId();\n\t}, []);\n\n\tuseEffect(() => {\n\t\timages.forEach((image, index) => {\n\t\t\tconst previousFile = previousImages?.[index];\n\t\t\tif (image.status !== previousFile?.status || image.dataURL !== previousFile.dataURL) {\n\t\t\t\tswitch (image.status) {\n\t\t\t\t\tcase EImageStatus.INJECTED:\n\t\t\t\t\t\tFileHelper.dataUrlToBlob(image.dataURL)\n\t\t\t\t\t\t\t.then((blob) => {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tfile: new File([blob], image.name),\n\t\t\t\t\t\t\t\t\t\tstatus: EImageStatus.NONE,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t.catch(() => {\n\t\t\t\t\t\t\t\tsetImages((prev) => prev.filter((prev, i) => i !== index));\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.NONE:\n\t\t\t\t\t\tif (filenameMatches) {\n\t\t\t\t\t\t\tconst pattern = resolveMatchesPattern(filenameMatches);\n\t\t\t\t\t\t\tif (pattern && !pattern.test(image.name)) {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tstatus: EImageStatus.ERROR_FILENAME,\n\t\t\t\t\t\t\t\t\t\tcustomErrorMessage: filenameMatchesErrorMessage,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tFileHelper.getType(image.file).then((fileType) => {\n\t\t\t\t\t\t\tconst mimeType = fileType.mime;\n\t\t\t\t\t\t\tif (mimeType && accepts.map(FileHelper.fileExtensionToMimeType).includes(mimeType)) {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\t\t\t\t\t\timages.map(({ name }) => name),\n\t\t\t\t\t\t\t\t\t\t\tindex,\n\t\t\t\t\t\t\t\t\t\t\tFileHelper.sanitizeFileName(image.name)\n\t\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t\t\ttype: mimeType,\n\t\t\t\t\t\t\t\t\t\tstatus: image.addedFrom !== \"schema\" ? image.status : EImageStatus.UPLOADED,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\tif (image.addedFrom !== \"schema\") {\n\t\t\t\t\t\t\t\t\tcompress ? compressImage(index, image) : convertImage(index, image);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t\t...image,\n\t\t\t\t\t\t\t\t\t\tstatus: EImageStatus.ERROR_FORMAT,\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.TO_RECOMPRESS:\n\t\t\t\t\t\trecompressImage(index, image);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.COMPRESSED:\n\t\t\t\t\tcase EImageStatus.CONVERTED:\n\t\t\t\t\tcase EImageStatus.RECOMPRESSED:\n\t\t\t\t\t\tif (!editImage) {\n\t\t\t\t\t\t\tconst shouldPreventDefault = !dispatchFieldEvent(\"upload-ready\", id, { imageData: image });\n\n\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t...updatedImages[index],\n\t\t\t\t\t\t\t\t\tstatus: shouldPreventDefault ? EImageStatus.PENDING : EImageStatus.UPLOAD_READY,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.UPLOAD_READY:\n\t\t\t\t\t\tuploadImage(index, image);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.TO_DELETE:\n\t\t\t\t\t\tsetImages((prev) => prev.filter(({ status }) => status !== EImageStatus.TO_DELETE));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase EImageStatus.UPLOADED:\n\t\t\t\t\t\tdispatchFieldEvent(\"uploaded\", id, { imageData: image });\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [images.map(({ status }) => status).join(\",\"), images.map(({ dataURL }) => dataURL).join(\",\")]);\n\n\t// track / update errors and values\n\tuseEffect(() => {\n\t\tlet updatedManagerErrorCount = 0;\n\t\timages.forEach((image) => {\n\t\t\tif (\n\t\t\t\t(image.type && !accepts.map(FileHelper.fileExtensionToMimeType).includes(image.type)) ||\n\t\t\t\t[EImageStatus.ERROR_GENERIC, EImageStatus.ERROR_SIZE, EImageStatus.ERROR_FILENAME].includes(\n\t\t\t\t\timage.status\n\t\t\t\t)\n\t\t\t) {\n\t\t\t\tupdatedManagerErrorCount++;\n\t\t\t}\n\t\t});\n\t\tsetErrorCount((prev) => Math.max(0, prev + updatedManagerErrorCount - managerErrorCount.current));\n\t\tmanagerErrorCount.current = updatedManagerErrorCount;\n\n\t\tconst uploadedImages = images.filter(\n\t\t\t({ status }) => status === EImageStatus.UPLOADED || status === EImageStatus.ERROR_CUSTOM_MUTED\n\t\t);\n\t\tconst notPrefilledImages = uploadedImages.filter(({ addedFrom }) => addedFrom !== \"schema\");\n\t\tconst gotDeleteImages = images.filter(({ status }) => status === EImageStatus.TO_DELETE).length > 0;\n\n\t\t/**\n\t\t * should dirty if\n\t\t * - it is dirty in the first place\n\t\t * - there are non-prefilled images\n\t\t * - user deleted image (differentiated from reset)\n\t\t */\n\t\tconst hasNotPrefilledImages = notPrefilledImages.length > 0;\n\t\tconst shouldDirty = hasNotPrefilledImages || gotDeleteImages;\n\n\t\tsetCurrentFileIds(uploadedImages.map(({ id }) => id));\n\n\t\tsetValue(\n\t\t\tid,\n\t\t\tuploadedImages.map(({ id, dataURL, drawingDataURL, name, metadata, uploadResponse }) => ({\n\t\t\t\tfileId: id,\n\t\t\t\tfileName: name,\n\t\t\t\tdataURL: drawingDataURL || dataURL,\n\t\t\t\tmetadata,\n\t\t\t\tuploadResponse,\n\t\t\t})),\n\t\t\t{ shouldDirty, shouldTouch: hasNotPrefilledImages }\n\t\t);\n\t}, [accepts, id, images, setErrorCount, setValue]);\n\n\tuseEffect(() => {\n\t\tif (previousValue !== undefined && value === undefined && images.length) {\n\t\t\tsetImages([]);\n\t\t}\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [previousValue === undefined, value === undefined, images.length]);\n\n\t// =============================================================================\n\t// HELPER FUNCTIONS\n\t// =============================================================================\n\tconst getScale = (origWidth: number, origHeight: number): number => {\n\t\tlet scale = dimensions.width / origWidth;\n\t\tif (origHeight * scale > dimensions.height) {\n\t\t\tscale = dimensions.height / origHeight;\n\t\t}\n\t\treturn scale;\n\t};\n\n\t/**\n\t * Converts a matches string (e.g. \"/^abc$/i\" or \"^abc$\") to a RegExp.\n\t * Returns undefined if the string is invalid.\n\t */\n\tconst resolveMatchesPattern = (matches: string): RegExp | undefined => {\n\t\ttry {\n\t\t\tconst parsed = matches.match(/^\\/(.+)\\/([gimsuy]*)$/);\n\t\t\treturn parsed ? new RegExp(parsed[1], parsed[2] || \"\") : new RegExp(matches);\n\t\t} catch {\n\t\t\treturn undefined;\n\t\t}\n\t};\n\n\tconst convertImage = async (index: number, image: IImage) => {\n\t\ttry {\n\t\t\tconst dataURL = await ImageHelper.convertBlob(image.file, FileHelper.fileExtensionToMimeType(outputType));\n\t\t\tconst filesize = FileHelper.getFilesizeFromBase64(dataURL);\n\n\t\t\tif (maxSizeInKb && filesize > maxSizeInKb * 1024) {\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_SIZE,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst metadata = await ImageHelper.getMetadata(image.file);\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tdataURL,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\tstatus: EImageStatus.CONVERTED,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t}\n\t};\n\n\tconst compressImage = async (index: number, imageToCompress: IImage) => {\n\t\ttry {\n\t\t\tconst dataURL = await ImageHelper.convertBlob(\n\t\t\t\timageToCompress.file,\n\t\t\t\tFileHelper.fileExtensionToMimeType(outputType)\n\t\t\t);\n\t\t\tconst image = await ImageHelper.dataUrlToImage(dataURL);\n\t\t\tconst origDim = { w: image.naturalWidth, h: image.naturalHeight };\n\t\t\tlet compressed: Blob;\n\t\t\tif (crop) {\n\t\t\t\tcompressed = await ImageHelper.resampleImage(image, {\n\t\t\t\t\twidth: dimensions.width,\n\t\t\t\t\theight: dimensions.height,\n\t\t\t\t\tcrop: true,\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\t\tcompressed = await ImageHelper.resampleImage(image, { scale });\n\t\t\t}\n\t\t\tif (maxSizeInKb) {\n\t\t\t\tcompressed = (await ImageHelper.compressImage(compressed, {\n\t\t\t\t\tfileSize: maxSizeInKb,\n\t\t\t\t})) as File;\n\t\t\t}\n\n\t\t\tif (maxSizeInKb && compressed.size > maxSizeInKb * 1024) {\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_SIZE,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tconst metadata = await ImageHelper.getMetadata(imageToCompress.file);\n\t\t\t\tconst dataURL = await FileHelper.fileToDataUrl(compressed);\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tdataURL,\n\t\t\t\t\t\tmetadata,\n\t\t\t\t\t\tstatus: EImageStatus.COMPRESSED,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t}\n\t\t} catch (e) {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t}\n\t};\n\n\tconst recompressImage = async (index: number, imageToCompress: IImage) => {\n\t\tif (imageToCompress.drawingDataURL) {\n\t\t\ttry {\n\t\t\t\tconst image = await ImageHelper.dataUrlToImage(imageToCompress.drawingDataURL);\n\t\t\t\tconst origDim = { w: image.naturalWidth, h: image.naturalHeight };\n\t\t\t\tlet scaledFile: Blob;\n\t\t\t\tif (crop) {\n\t\t\t\t\tscaledFile = await ImageHelper.resampleImage(image, {\n\t\t\t\t\t\twidth: dimensions.width,\n\t\t\t\t\t\theight: dimensions.height,\n\t\t\t\t\t\tcrop: true,\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\t\t\tscaledFile = await ImageHelper.resampleImage(image, { scale });\n\t\t\t\t}\n\t\t\t\tscaledFile = (await ImageHelper.compressImage(scaledFile, { fileSize: maxSizeInKb })) as File;\n\n\t\t\t\tif (scaledFile.size > maxSizeInKb * 1024) {\n\t\t\t\t\tconst updatedImages = [...images];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...images[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_SIZE,\n\t\t\t\t\t};\n\t\t\t\t\tsetImages(updatedImages);\n\t\t\t\t} else {\n\t\t\t\t\tconst dataURL = await FileHelper.fileToDataUrl(scaledFile);\n\t\t\t\t\tconst updatedImages = [...images];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...images[index],\n\t\t\t\t\t\tdrawingDataURL: dataURL,\n\t\t\t\t\t\tstatus: EImageStatus.RECOMPRESSED,\n\t\t\t\t\t};\n\t\t\t\t\tsetImages(updatedImages);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\tsetImages((prev) => {\n\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t\t};\n\t\t\t\t\treturn updatedImages;\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t};\n\n\tconst uploadImage = async (index: number, iFile: IImage) => {\n\t\ttry {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.UPLOADING,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\n\t\t\tlet response: unknown;\n\t\t\tif (upload?.method && upload?.url) {\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append(\"dataURL\", iFile.drawingDataURL || iFile.dataURL || \"\");\n\t\t\t\tformData.append(\"sessionId\", upload?.sessionId || sessionId.current || \"\");\n\t\t\t\tformData.append(\"slot\", `${iFile.slot}`);\n\t\t\t\tresponse = await new AxiosApiClient(\"\", undefined, undefined, true)[upload.method](\n\t\t\t\t\tupload.url,\n\t\t\t\t\tformData,\n\t\t\t\t\t{\n\t\t\t\t\t\tonUploadProgress: (progressEvent) => {\n\t\t\t\t\t\t\tconst { loaded, total } = progressEvent;\n\t\t\t\t\t\t\tconst percent = Math.floor((loaded * 100) / total);\n\t\t\t\t\t\t\tsetImages((prev) => {\n\t\t\t\t\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\t\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\t\t\t\tuploadProgress: percent,\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\treturn updatedImages;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t},\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tuploadResponse: response,\n\t\t\t\t\tstatus: EImageStatus.UPLOADED,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tsetImages((prev) => {\n\t\t\t\tconst updatedImages = [...prev];\n\t\t\t\tupdatedImages[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tstatus: EImageStatus.ERROR_GENERIC,\n\t\t\t\t};\n\t\t\t\treturn updatedImages;\n\t\t\t});\n\t\t}\n\t};\n\n\treturn null;\n};\n"],"names":["props","accepts","compress","crop","dimensions","editImage","id","maxSizeInKb","outputType","upload","filenameMatches","filenameMatchesErrorMessage","value","images","setImages","setErrorCount","setCurrentFileIds","useContext","ImageContext","previousImages","usePrevious","previousValue","setValue","useFormContext","sessionId","useRef","managerErrorCount","dispatchFieldEvent","addFieldEventListener","removeFieldEventListener","useFieldEvent","useEffect","handleUpdateImageStatus","e","prev","imageIndex","findIndex","image","detail","updatedImage","status","updatedStatus","customErrorMessage","errorMessage","newImages","splice","current","generateRandomId","forEach","index","previousFile","dataURL","EImageStatus","INJECTED","FileHelper","dataUrlToBlob","then","blob","updatedImages","file","File","name","NONE","catch","filter","i","pattern","resolveMatchesPattern","test","ERROR_FILENAME","getType","fileType","mimeType","mime","map","fileExtensionToMimeType","includes","deduplicateFileName","sanitizeFileName","type","addedFrom","UPLOADED","compressImage","convertImage","ERROR_FORMAT","TO_RECOMPRESS","recompressImage","COMPRESSED","CONVERTED","RECOMPRESSED","shouldPreventDefault","imageData","PENDING","UPLOAD_READY","uploadImage","TO_DELETE","join","updatedManagerErrorCount","ERROR_GENERIC","ERROR_SIZE","Math","max","uploadedImages","ERROR_CUSTOM_MUTED","notPrefilledImages","gotDeleteImages","length","hasNotPrefilledImages","shouldDirty","drawingDataURL","metadata","uploadResponse","fileId","fileName","shouldTouch","undefined","getScale","origWidth","origHeight","scale","width","height","matches","parsed","match","RegExp","async","ImageHelper","convertBlob","filesize","getFilesizeFromBase64","getMetadata","imageToCompress","dataUrlToImage","origDim","w","naturalWidth","h","naturalHeight","compressed","resampleImage","fileSize","size","fileToDataUrl","scaledFile","iFile","response","UPLOADING","method","url","formData","FormData","append","slot","AxiosApiClient","onUploadProgress","progressEvent","loaded","total","percent","floor","uploadProgress","err"],"mappings":"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"}