@lifesg/web-frontend-engine 2.0.0-alpha.16 → 2.0.0-alpha.17

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.9f118208.js → file-upload-manager.2b398bb3.js} +2 -2
  2. package/chunks/{file-upload-manager.9f118208.js.map → file-upload-manager.2b398bb3.js.map} +1 -1
  3. package/chunks/{index.c97fe9cd.js → index.5717ded2.js} +2 -2
  4. package/chunks/{index.c97fe9cd.js.map → index.5717ded2.js.map} +1 -1
  5. package/chunks/{index.f7bdb097.js → index.b12f3d48.js} +6 -6
  6. package/chunks/{index.f7bdb097.js.map → index.b12f3d48.js.map} +1 -1
  7. package/chunks/{index.cffe8c57.js → index.cb4dea03.js} +2 -2
  8. package/chunks/{index.cffe8c57.js.map → index.cb4dea03.js.map} +1 -1
  9. package/chunks/{location-modal.422d3eb2.js → location-modal.196e1cc7.js} +2 -2
  10. package/chunks/{location-modal.422d3eb2.js.map → location-modal.196e1cc7.js.map} +1 -1
  11. package/cjs/chunks/{file-upload-manager.d135168d.js → file-upload-manager.a0c694e9.js} +2 -2
  12. package/cjs/chunks/{file-upload-manager.d135168d.js.map → file-upload-manager.a0c694e9.js.map} +1 -1
  13. package/cjs/chunks/{index.9a5d993e.js → index.04ef1675.js} +2 -2
  14. package/cjs/chunks/{index.9a5d993e.js.map → index.04ef1675.js.map} +1 -1
  15. package/cjs/chunks/{index.088882e6.js → index.5744c5c8.js} +2 -2
  16. package/cjs/chunks/{index.088882e6.js.map → index.5744c5c8.js.map} +1 -1
  17. package/cjs/chunks/{index.75d6b664.js → index.999467ae.js} +6 -6
  18. package/cjs/chunks/{index.75d6b664.js.map → index.999467ae.js.map} +1 -1
  19. package/cjs/chunks/{location-modal.fa5b0c93.js → location-modal.2173a102.js} +2 -2
  20. package/cjs/chunks/{location-modal.fa5b0c93.js.map → location-modal.2173a102.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
- import{useContext as t,useRef as e,useEffect as s}from"react";import{e as a,u as i,a as r,b as o,g as n,f as l,d as c,I as m,A as d}from"./index.f7bdb097.js";import"react/jsx-runtime";import"@lifesg/react-design-system/theme";import"styled-components";import"@lifesg/react-design-system/typography";import"@lifesg/react-design-system/button";import"@lifesg/react-design-system/modal";import"@lifesg/react-design-system/markup";import"react-dom/server";import"@lifesg/react-design-system/alert";import"@lifesg/react-design-system/layout";import"@lifesg/react-design-system/box-container";import"@lifesg/react-design-system/divider";import"@lifesg/react-design-system/v2_media";import"@lifesg/react-design-system/text-list";import"@lifesg/react-design-system/popover-v2";import"@lifesg/react-icons";import"@lifesg/react-design-system/tab";import"@lifesg/react-icons/plus-circle-fill";import"@lifesg/react-design-system/button-with-icon";import"@lifesg/react-design-system/error-display";import"@lifesg/react-design-system/filter";import"@lifesg/react-design-system/uneditable-section";import"@lifesg/react-design-system/timeline";import"@lifesg/react-design-system/form";import"@lifesg/react-design-system/checkbox";import"@lifesg/react-design-system/toggle";import"@lifesg/react-design-system/file-upload";import"@lifesg/react-icons/cross";import"@lifesg/react-design-system/icon-button";import"@lifesg/react-icons/bin";import"@lifesg/react-icons/eraser";import"@lifesg/react-icons/pencil";import"@lifesg/react-icons/pencil-stroke";import"@lifesg/react-icons/plus";import"@lifesg/react-icons/exclamation-triangle";import"@lifesg/react-icons/pin-fill";import"@lifesg/react-design-system/image-button";import"@lifesg/react-design-system/radio-button";import"@lifesg/react-design-system/v2_layout";const g=g=>{const{accepts:p,compress:u,dimensions:f,editImage:E,id:R,maxSizeInKb:y,outputType:h,upload:D,value:O}=g,{images:U,setImages:T,setErrorCount:w,setCurrentFileIds:I}=t(a),L=i(U),b=i(O),{setValue:_}=r(),v=e(),S=e(0),{dispatchFieldEvent:M,addFieldEventListener:N,removeFieldEventListener:C}=o();s((()=>{const t=t=>{T((e=>{const s=e.findIndex((e=>e.id===t.detail.id)),a={...e[s]};a.status=t.detail.updatedStatus,a.customErrorMessage=t.detail.errorMessage;const i=[...e];return i.splice(s,1,a),i}))};return N("update-image-status",R,t),()=>C("update-image-status",R,t)}),[N,R,C,T]),s((()=>{v.current=n()}),[]),s((()=>{U.forEach(((t,e)=>{const s=L?.[e];if(t.status!==s?.status||t.dataURL!==s.dataURL)switch(t.status){case l.INJECTED:c.dataUrlToBlob(t.dataURL).then((s=>{T((a=>{const i=[...a];return i[e]={...t,file:new File([s],t.name),status:l.NONE},i}))})).catch((()=>{T((t=>t.filter(((t,s)=>s!==e))))}));break;case l.NONE:c.getType(t.file).then((s=>{const a=s.mime;a&&p.map(c.fileExtensionToMimeType).includes(a)?(T((s=>{const i=[...s];return i[e]={...t,name:c.deduplicateFileName(U.map((({name:t})=>t)),e,c.sanitizeFileName(t.name)),type:a,status:"schema"!==t.addedFrom?t.status:l.UPLOADED},i})),"schema"!==t.addedFrom&&(u?F(e,t):x(e,t))):T((s=>{const a=[...s];return a[e]={...t,status:l.ERROR_FORMAT},a}))}));break;case l.TO_RECOMPRESS:A(e,t);break;case l.COMPRESSED:case l.CONVERTED:case l.RECOMPRESSED:if(!E){const s=!M("upload-ready",R,{imageData:t});T((t=>{const a=[...t];return a[e]={...a[e],status:s?l.PENDING:l.UPLOAD_READY},a}))}break;case l.UPLOAD_READY:k(e,t);break;case l.TO_DELETE:T((t=>t.filter((({status:t})=>t!==l.TO_DELETE))));break;case l.UPLOADED:M("uploaded",R,{imageData:t})}}))}),[U.map((({status:t})=>t)).join(","),U.map((({dataURL:t})=>t)).join(",")]),s((()=>{let t=0;U.forEach((e=>{(e.type&&!p.map(c.fileExtensionToMimeType).includes(e.type)||[l.ERROR_GENERIC,l.ERROR_SIZE].includes(e.status))&&t++})),w((e=>Math.max(0,e+t-S.current))),S.current=t;const e=U.filter((({status:t})=>t===l.UPLOADED||t===l.ERROR_CUSTOM_MUTED)),s=e.filter((({addedFrom:t})=>"schema"!==t)),a=U.filter((({status:t})=>t===l.TO_DELETE)).length>0,i=s.length>0,r=i||a;I(e.map((({id:t})=>t))),_(R,e.map((({id:t,dataURL:e,drawingDataURL:s,name:a,metadata:i,uploadResponse:r})=>({fileId:t,fileName:a,dataURL:s||e,metadata:i,uploadResponse:r}))),{shouldDirty:r,shouldTouch:i})}),[p,R,U,w,_]),s((()=>{void 0!==b&&void 0===O&&U.length&&T([])}),[void 0===b,void 0===O,U.length]);const P=(t,e)=>{let s=f.width/t;return e*s>f.height&&(s=f.height/e),s},x=async(t,e)=>{try{const s=await m.convertBlob(e.file,c.fileExtensionToMimeType(h)),a=c.getFilesizeFromBase64(s);if(y&&a>1024*y)T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_SIZE},s}));else{const a=await m.getMetadata(e.file);T((e=>{const i=[...e];return i[t]={...e[t],dataURL:s,metadata:a,status:l.CONVERTED},i}))}}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}},F=async(t,e)=>{try{const s=await m.convertBlob(e.file,c.fileExtensionToMimeType(h)),a=await m.dataUrlToImage(s),i={w:a.naturalWidth,h:a.naturalHeight},r=P(i.w,i.h);let o=await m.resampleImage(a,{scale:r});if(y&&(o=await m.compressImage(o,{fileSize:y})),y&&o.size>1024*y)T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_SIZE},s}));else{const s=await m.getMetadata(e.file),a=await c.fileToDataUrl(o);T((e=>{const i=[...e];return i[t]={...e[t],dataURL:a,metadata:s,status:l.COMPRESSED},i}))}}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}},A=async(t,e)=>{if(e.drawingDataURL)try{const s=await m.dataUrlToImage(e.drawingDataURL),a={w:s.naturalWidth,h:s.naturalHeight},i=P(a.w,a.h);let r=await m.resampleImage(s,{scale:i});if(r=await m.compressImage(r,{fileSize:y}),r.size>1024*y){const e=[...U];e[t]={...U[t],status:l.ERROR_SIZE},T(e)}else{const e=await c.fileToDataUrl(r),s=[...U];s[t]={...U[t],drawingDataURL:e,status:l.RECOMPRESSED},T(s)}}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}},k=async(t,e)=>{try{let s;if(T((e=>{const s=[...e];return s[t]={...e[t],status:l.UPLOADING},s})),D?.method&&D?.url){const a=new FormData;a.append("dataURL",e.drawingDataURL||e.dataURL||""),a.append("sessionId",D?.sessionId||v.current||""),a.append("slot",`${e.slot}`),s=await new d("",void 0,void 0,!0)[D.method](D.url,a,{onUploadProgress:e=>{const{loaded:s,total:a}=e,i=Math.floor(100*s/a);T((e=>{const s=[...e];return s[t]={...e[t],uploadProgress:i},s}))}})}T((e=>{const a=[...e];return a[t]={...e[t],uploadResponse:s,status:l.UPLOADED},a}))}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}};return null};export{g as default};
2
- //# sourceMappingURL=index.cffe8c57.js.map
1
+ import{useContext as t,useRef as e,useEffect as s}from"react";import{e as a,u as i,a as r,b as o,g as n,f as l,d as c,I as m,A as d}from"./index.b12f3d48.js";import"react/jsx-runtime";import"@lifesg/react-design-system/theme";import"styled-components";import"@lifesg/react-design-system/typography";import"@lifesg/react-design-system/button";import"@lifesg/react-design-system/modal";import"@lifesg/react-design-system/markup";import"react-dom/server";import"@lifesg/react-design-system/alert";import"@lifesg/react-design-system/layout";import"@lifesg/react-design-system/box-container";import"@lifesg/react-design-system/divider";import"@lifesg/react-design-system/v2_media";import"@lifesg/react-design-system/text-list";import"@lifesg/react-design-system/popover-v2";import"@lifesg/react-icons";import"@lifesg/react-design-system/tab";import"@lifesg/react-icons/plus-circle-fill";import"@lifesg/react-design-system/button-with-icon";import"@lifesg/react-design-system/error-display";import"@lifesg/react-design-system/filter";import"@lifesg/react-design-system/uneditable-section";import"@lifesg/react-design-system/timeline";import"@lifesg/react-design-system/form";import"@lifesg/react-design-system/checkbox";import"@lifesg/react-design-system/toggle";import"@lifesg/react-design-system/file-upload";import"@lifesg/react-icons/cross";import"@lifesg/react-design-system/icon-button";import"@lifesg/react-icons/bin";import"@lifesg/react-icons/eraser";import"@lifesg/react-icons/pencil";import"@lifesg/react-icons/pencil-stroke";import"@lifesg/react-icons/plus";import"@lifesg/react-icons/exclamation-triangle";import"@lifesg/react-icons/pin-fill";import"@lifesg/react-design-system/image-button";import"@lifesg/react-design-system/radio-button";import"@lifesg/react-design-system/v2_layout";const g=g=>{const{accepts:p,compress:u,dimensions:f,editImage:E,id:R,maxSizeInKb:y,outputType:h,upload:D,value:O}=g,{images:U,setImages:T,setErrorCount:w,setCurrentFileIds:I}=t(a),L=i(U),b=i(O),{setValue:_}=r(),v=e(),S=e(0),{dispatchFieldEvent:M,addFieldEventListener:N,removeFieldEventListener:C}=o();s((()=>{const t=t=>{T((e=>{const s=e.findIndex((e=>e.id===t.detail.id)),a={...e[s]};a.status=t.detail.updatedStatus,a.customErrorMessage=t.detail.errorMessage;const i=[...e];return i.splice(s,1,a),i}))};return N("update-image-status",R,t),()=>C("update-image-status",R,t)}),[N,R,C,T]),s((()=>{v.current=n()}),[]),s((()=>{U.forEach(((t,e)=>{const s=L?.[e];if(t.status!==s?.status||t.dataURL!==s.dataURL)switch(t.status){case l.INJECTED:c.dataUrlToBlob(t.dataURL).then((s=>{T((a=>{const i=[...a];return i[e]={...t,file:new File([s],t.name),status:l.NONE},i}))})).catch((()=>{T((t=>t.filter(((t,s)=>s!==e))))}));break;case l.NONE:c.getType(t.file).then((s=>{const a=s.mime;a&&p.map(c.fileExtensionToMimeType).includes(a)?(T((s=>{const i=[...s];return i[e]={...t,name:c.deduplicateFileName(U.map((({name:t})=>t)),e,c.sanitizeFileName(t.name)),type:a,status:"schema"!==t.addedFrom?t.status:l.UPLOADED},i})),"schema"!==t.addedFrom&&(u?F(e,t):x(e,t))):T((s=>{const a=[...s];return a[e]={...t,status:l.ERROR_FORMAT},a}))}));break;case l.TO_RECOMPRESS:A(e,t);break;case l.COMPRESSED:case l.CONVERTED:case l.RECOMPRESSED:if(!E){const s=!M("upload-ready",R,{imageData:t});T((t=>{const a=[...t];return a[e]={...a[e],status:s?l.PENDING:l.UPLOAD_READY},a}))}break;case l.UPLOAD_READY:k(e,t);break;case l.TO_DELETE:T((t=>t.filter((({status:t})=>t!==l.TO_DELETE))));break;case l.UPLOADED:M("uploaded",R,{imageData:t})}}))}),[U.map((({status:t})=>t)).join(","),U.map((({dataURL:t})=>t)).join(",")]),s((()=>{let t=0;U.forEach((e=>{(e.type&&!p.map(c.fileExtensionToMimeType).includes(e.type)||[l.ERROR_GENERIC,l.ERROR_SIZE].includes(e.status))&&t++})),w((e=>Math.max(0,e+t-S.current))),S.current=t;const e=U.filter((({status:t})=>t===l.UPLOADED||t===l.ERROR_CUSTOM_MUTED)),s=e.filter((({addedFrom:t})=>"schema"!==t)),a=U.filter((({status:t})=>t===l.TO_DELETE)).length>0,i=s.length>0,r=i||a;I(e.map((({id:t})=>t))),_(R,e.map((({id:t,dataURL:e,drawingDataURL:s,name:a,metadata:i,uploadResponse:r})=>({fileId:t,fileName:a,dataURL:s||e,metadata:i,uploadResponse:r}))),{shouldDirty:r,shouldTouch:i})}),[p,R,U,w,_]),s((()=>{void 0!==b&&void 0===O&&U.length&&T([])}),[void 0===b,void 0===O,U.length]);const P=(t,e)=>{let s=f.width/t;return e*s>f.height&&(s=f.height/e),s},x=async(t,e)=>{try{const s=await m.convertBlob(e.file,c.fileExtensionToMimeType(h)),a=c.getFilesizeFromBase64(s);if(y&&a>1024*y)T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_SIZE},s}));else{const a=await m.getMetadata(e.file);T((e=>{const i=[...e];return i[t]={...e[t],dataURL:s,metadata:a,status:l.CONVERTED},i}))}}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}},F=async(t,e)=>{try{const s=await m.convertBlob(e.file,c.fileExtensionToMimeType(h)),a=await m.dataUrlToImage(s),i={w:a.naturalWidth,h:a.naturalHeight},r=P(i.w,i.h);let o=await m.resampleImage(a,{scale:r});if(y&&(o=await m.compressImage(o,{fileSize:y})),y&&o.size>1024*y)T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_SIZE},s}));else{const s=await m.getMetadata(e.file),a=await c.fileToDataUrl(o);T((e=>{const i=[...e];return i[t]={...e[t],dataURL:a,metadata:s,status:l.COMPRESSED},i}))}}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}},A=async(t,e)=>{if(e.drawingDataURL)try{const s=await m.dataUrlToImage(e.drawingDataURL),a={w:s.naturalWidth,h:s.naturalHeight},i=P(a.w,a.h);let r=await m.resampleImage(s,{scale:i});if(r=await m.compressImage(r,{fileSize:y}),r.size>1024*y){const e=[...U];e[t]={...U[t],status:l.ERROR_SIZE},T(e)}else{const e=await c.fileToDataUrl(r),s=[...U];s[t]={...U[t],drawingDataURL:e,status:l.RECOMPRESSED},T(s)}}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}},k=async(t,e)=>{try{let s;if(T((e=>{const s=[...e];return s[t]={...e[t],status:l.UPLOADING},s})),D?.method&&D?.url){const a=new FormData;a.append("dataURL",e.drawingDataURL||e.dataURL||""),a.append("sessionId",D?.sessionId||v.current||""),a.append("slot",`${e.slot}`),s=await new d("",void 0,void 0,!0)[D.method](D.url,a,{onUploadProgress:e=>{const{loaded:s,total:a}=e,i=Math.floor(100*s/a);T((e=>{const s=[...e];return s[t]={...e[t],uploadProgress:i},s}))}})}T((e=>{const a=[...e];return a[t]={...e[t],uploadResponse:s,status:l.UPLOADED},a}))}catch(e){T((e=>{const s=[...e];return s[t]={...e[t],status:l.ERROR_GENERIC},s}))}};return null};export{g as default};
2
+ //# sourceMappingURL=index.cb4dea03.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cffe8c57.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\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\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 { accepts, compress, dimensions, editImage, id, maxSizeInKb, outputType, upload, value } = 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\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].includes(image.status)\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\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\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\tlet compressed = await ImageHelper.resampleImage(image, { scale });\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\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\t\tlet scaledFile = await ImageHelper.resampleImage(image, { scale });\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":["ImageManager","props","accepts","compress","dimensions","editImage","id","maxSizeInKb","outputType","upload","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","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","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":"kwDA+Ba,MAAAA,EAAgBC,IAI5B,MAAMC,QAAEA,EAAOC,SAAEA,EAAQC,WAAEA,EAAUC,UAAEA,EAASC,GAAEA,EAAEC,YAAEA,EAAWC,WAAEA,EAAUC,OAAEA,EAAMC,MAAEA,GAAUT,GAC3FU,OAAEA,EAAMC,UAAEA,EAASC,cAAEA,EAAaC,kBAAEA,GAAsBC,EAAWC,GACrEC,EAAiBC,EAAYP,GAC7BQ,EAAgBD,EAAYR,IAC5BU,SAAEA,GAAaC,IACfC,EAAYC,IACZC,EAAoBD,EAAO,IAE3BE,mBAAEA,EAAkBC,sBAAEA,EAAqBC,yBAAEA,GAA6BC,IAKhFC,GAAU,KACT,MAAMC,EAA2BC,IAChCnB,GAAWoB,IACV,MAAMC,EAAaD,EAAKE,WAAWC,GAAUA,EAAM7B,KAAOyB,EAAEK,OAAO9B,KAC7D+B,EAAe,IAAKL,EAAKC,IAC/BI,EAAaC,OAASP,EAAEK,OAAOG,cAC/BF,EAAaG,mBAAqBT,EAAEK,OAAOK,aAE3C,MAAMC,EAAY,IAAIV,GAEtB,OADAU,EAAUC,OAAOV,EAAY,EAAGI,GACzBK,CAAS,GACf,EAIH,OADAhB,EAAsB,sBAAuBpB,EAAIwB,GAC1C,IAAMH,EAAyB,sBAAuBrB,EAAIwB,EAAwB,GACvF,CAACJ,EAAuBpB,EAAIqB,EAA0Bf,IAGzDiB,GAAU,KACTP,EAAUsB,QAAUC,GAAkB,GACpC,IAEHhB,GAAU,KACTlB,EAAOmC,SAAQ,CAACX,EAAOY,KACtB,MAAMC,EAAe/B,IAAiB8B,GACtC,GAAIZ,EAAMG,SAAWU,GAAcV,QAAUH,EAAMc,UAAYD,EAAaC,QAC3E,OAAQd,EAAMG,QACb,KAAKY,EAAaC,SACjBC,EAAWC,cAAclB,EAAMc,SAC7BK,MAAMC,IACN3C,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAM1B,OALAwB,EAAcT,GAAS,IACnBZ,EACHsB,KAAM,IAAIC,KAAK,CAACH,GAAOpB,EAAMwB,MAC7BrB,OAAQY,EAAaU,MAEfJ,CAAa,GACnB,IAEFK,OAAM,KACNjD,GAAWoB,GAASA,EAAK8B,QAAO,CAAC9B,EAAM+B,IAAMA,IAAMhB,KAAO,IAE5D,MACD,KAAKG,EAAaU,KACjBR,EAAWY,QAAQ7B,EAAMsB,MAAMH,MAAMW,IACpC,MAAMC,EAAWD,EAASE,KACtBD,GAAYhE,EAAQkE,IAAIhB,EAAWiB,yBAAyBC,SAASJ,IACxEtD,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAW1B,OAVAwB,EAAcT,GAAS,IACnBZ,EACHwB,KAAMP,EAAWmB,oBAChB5D,EAAOyD,KAAI,EAAGT,UAAWA,IACzBZ,EACAK,EAAWoB,iBAAiBrC,EAAMwB,OAEnCc,KAAMP,EACN5B,OAA4B,WAApBH,EAAMuC,UAAyBvC,EAAMG,OAASY,EAAayB,UAE7DnB,CAAa,IAEG,WAApBrB,EAAMuC,YACTvE,EAAWyE,EAAc7B,EAAOZ,GAAS0C,EAAa9B,EAAOZ,KAG9DvB,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBZ,EACHG,OAAQY,EAAa4B,cAEftB,CAAa,GAErB,IAEF,MACD,KAAKN,EAAa6B,cACjBC,EAAgBjC,EAAOZ,GACvB,MACD,KAAKe,EAAa+B,WAClB,KAAK/B,EAAagC,UAClB,KAAKhC,EAAaiC,aACjB,IAAK9E,EAAW,CACf,MAAM+E,GAAwB3D,EAAmB,eAAgBnB,EAAI,CAAE+E,UAAWlD,IAElFvB,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBS,EAAcT,GACjBT,OAAQ8C,EAAuBlC,EAAaoC,QAAUpC,EAAaqC,cAE7D/B,CAAa,GAErB,CACD,MACD,KAAKN,EAAaqC,aACjBC,EAAYzC,EAAOZ,GACnB,MACD,KAAKe,EAAauC,UACjB7E,GAAWoB,GAASA,EAAK8B,QAAO,EAAGxB,YAAaA,IAAWY,EAAauC,cACxE,MACD,KAAKvC,EAAayB,SACjBlD,EAAmB,WAAYnB,EAAI,CAAE+E,UAAWlD,IAGlD,GACA,GAEA,CAACxB,EAAOyD,KAAI,EAAG9B,YAAaA,IAAQoD,KAAK,KAAM/E,EAAOyD,KAAI,EAAGnB,aAAcA,IAASyC,KAAK,OAG5F7D,GAAU,KACT,IAAI8D,EAA2B,EAC/BhF,EAAOmC,SAASX,KAEbA,EAAMsC,OAASvE,EAAQkE,IAAIhB,EAAWiB,yBAAyBC,SAASnC,EAAMsC,OAC/E,CAACvB,EAAa0C,cAAe1C,EAAa2C,YAAYvB,SAASnC,EAAMG,UAErEqD,GACA,IAEF9E,GAAemB,GAAS8D,KAAKC,IAAI,EAAG/D,EAAO2D,EAA2BnE,EAAkBoB,WACxFpB,EAAkBoB,QAAU+C,EAE5B,MAAMK,EAAiBrF,EAAOmD,QAC7B,EAAGxB,YAAaA,IAAWY,EAAayB,UAAYrC,IAAWY,EAAa+C,qBAEvEC,EAAqBF,EAAelC,QAAO,EAAGY,eAA8B,WAAdA,IAC9DyB,EAAkBxF,EAAOmD,QAAO,EAAGxB,YAAaA,IAAWY,EAAauC,YAAWW,OAAS,EAQ5FC,EAAwBH,EAAmBE,OAAS,EACpDE,EAAcD,GAAyBF,EAE7CrF,EAAkBkF,EAAe5B,KAAI,EAAG9D,QAASA,KAEjDc,EACCd,EACA0F,EAAe5B,KAAI,EAAG9D,KAAI2C,UAASsD,iBAAgB5C,OAAM6C,WAAUC,qBAAsB,CACxFC,OAAQpG,EACRqG,SAAUhD,EACVV,QAASsD,GAAkBtD,EAC3BuD,WACAC,qBAED,CAAEH,cAAaM,YAAaP,GAC5B,GACC,CAACnG,EAASI,EAAIK,EAAQE,EAAeO,IAExCS,GAAU,UACagF,IAAlB1F,QAAyC0F,IAAVnG,GAAuBC,EAAOyF,QAChExF,EAAU,GACV,GAEC,MAAmBiG,IAAlB1F,OAAuC0F,IAAVnG,EAAqBC,EAAOyF,SAK7D,MAAMU,EAAW,CAACC,EAAmBC,KACpC,IAAIC,EAAQ7G,EAAW8G,MAAQH,EAI/B,OAHIC,EAAaC,EAAQ7G,EAAW+G,SACnCF,EAAQ7G,EAAW+G,OAASH,GAEtBC,CAAK,EAGPpC,EAAeuC,MAAOrE,EAAeZ,KAC1C,IACC,MAAMc,QAAgBoE,EAAYC,YAAYnF,EAAMsB,KAAML,EAAWiB,wBAAwB7D,IACvF+G,EAAWnE,EAAWoE,sBAAsBvE,GAElD,GAAI1C,GAAegH,EAAyB,KAAdhH,EAC7BK,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAa2C,YAEfrC,CAAa,QAEf,CACN,MAAMgD,QAAiBa,EAAYI,YAAYtF,EAAMsB,MACrD7C,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAO1B,OANAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRE,UACAuD,WACAlE,OAAQY,EAAagC,WAEf1B,CAAa,GAErB,CACD,CAAC,MAAOzB,GACRnB,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAa0C,eAEfpC,CAAa,GAErB,GAGIoB,EAAgBwC,MAAOrE,EAAe2E,KAC3C,IACC,MAAMzE,QAAgBoE,EAAYC,YACjCI,EAAgBjE,KAChBL,EAAWiB,wBAAwB7D,IAE9B2B,QAAckF,EAAYM,eAAe1E,GACzC2E,EAAU,CAAEC,EAAG1F,EAAM2F,aAAcC,EAAG5F,EAAM6F,eAC5Cf,EAAQH,EAASc,EAAQC,EAAGD,EAAQG,GAC1C,IAAIE,QAAmBZ,EAAYa,cAAc/F,EAAO,CAAE8E,UAO1D,GANI1G,IACH0H,QAAoBZ,EAAYzC,cAAcqD,EAAY,CACzDE,SAAU5H,KAIRA,GAAe0H,EAAWG,KAAqB,KAAd7H,EACpCK,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAa2C,YAEfrC,CAAa,QAEf,CACN,MAAMgD,QAAiBa,EAAYI,YAAYC,EAAgBjE,MACzDR,QAAgBG,EAAWiF,cAAcJ,GAC/CrH,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAO1B,OANAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRE,UACAuD,WACAlE,OAAQY,EAAa+B,YAEfzB,CAAa,GAErB,CACD,CAAC,MAAOzB,GACRnB,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAa0C,eAEfpC,CAAa,GAErB,GAGIwB,EAAkBoC,MAAOrE,EAAe2E,KAC7C,GAAIA,EAAgBnB,eACnB,IACC,MAAMpE,QAAckF,EAAYM,eAAeD,EAAgBnB,gBACzDqB,EAAU,CAAEC,EAAG1F,EAAM2F,aAAcC,EAAG5F,EAAM6F,eAC5Cf,EAAQH,EAASc,EAAQC,EAAGD,EAAQG,GAC1C,IAAIO,QAAmBjB,EAAYa,cAAc/F,EAAO,CAAE8E,UAG1D,GAFAqB,QAAoBjB,EAAYzC,cAAc0D,EAAY,CAAEH,SAAU5H,IAElE+H,EAAWF,KAAqB,KAAd7H,EAAoB,CACzC,MAAMiD,EAAgB,IAAI7C,GAC1B6C,EAAcT,GAAS,IACnBpC,EAAOoC,GACVT,OAAQY,EAAa2C,YAEtBjF,EAAU4C,EACV,KAAM,CACN,MAAMP,QAAgBG,EAAWiF,cAAcC,GACzC9E,EAAgB,IAAI7C,GAC1B6C,EAAcT,GAAS,IACnBpC,EAAOoC,GACVwD,eAAgBtD,EAChBX,OAAQY,EAAaiC,cAEtBvE,EAAU4C,EACV,CACD,CAAC,MAAOzB,GACRnB,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAa0C,eAEfpC,CAAa,GAErB,CACD,EAGIgC,EAAc4B,MAAOrE,EAAewF,KACzC,IAUC,IAAIC,EACJ,GAVA5H,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAauF,WAEfjF,CAAa,IAIjB/C,GAAQiI,QAAUjI,GAAQkI,IAAK,CAClC,MAAMC,EAAW,IAAIC,SACrBD,EAASE,OAAO,UAAWP,EAAMhC,gBAAkBgC,EAAMtF,SAAW,IACpE2F,EAASE,OAAO,YAAarI,GAAQa,WAAaA,EAAUsB,SAAW,IACvEgG,EAASE,OAAO,OAAQ,GAAGP,EAAMQ,QACjCP,QAAiB,IAAIQ,EAAe,QAAInC,OAAWA,GAAW,GAAMpG,EAAOiI,QAC1EjI,EAAOkI,IACPC,EACA,CACCK,iBAAmBC,IAClB,MAAMC,OAAEA,EAAMC,MAAEA,GAAUF,EACpBG,EAAUvD,KAAKwD,MAAgB,IAATH,EAAgBC,GAC5CxI,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRwG,eAAgBF,GAEV7F,CAAa,GACnB,GAIL,CAED5C,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAM1B,OALAwB,EAAcT,GAAS,IACnBf,EAAKe,GACR0D,eAAgB+B,EAChBlG,OAAQY,EAAayB,UAEfnB,CAAa,GAErB,CAAC,MAAOgG,GACR5I,GAAWoB,IACV,MAAMwB,EAAgB,IAAIxB,GAK1B,OAJAwB,EAAcT,GAAS,IACnBf,EAAKe,GACRT,OAAQY,EAAa0C,eAEfpC,CAAa,GAErB,GAGF,OAAO,IAAI"}
1
+ {"version":3,"file":"index.cb4dea03.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\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\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 { accepts, compress, dimensions, editImage, id, maxSizeInKb, outputType, upload, value } = 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\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].includes(image.status)\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\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\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\tlet compressed = await ImageHelper.resampleImage(image, { scale });\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\tconst scale = getScale(origDim.w, origDim.h);\n\t\t\t\tlet scaledFile = await ImageHelper.resampleImage(image, { scale });\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":["ImageManager","props","accepts","compress","dimensions","editImage","id","maxSizeInKb","outputType","upload","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","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","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,4 +1,4 @@
1
- import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{Modal as i}from"@lifesg/react-design-system/modal";import{Colour as o,Font as r,Spacing as s,MediaQuery as a,Breakpoint as l,Border as h,Motion as c}from"@lifesg/react-design-system/theme";import{h as u,b as d,L as p,T as m,O as f,i as _,j as g,G as v,l as y,S as x,P as b,k as w,D as P}from"./index.f7bdb097.js";import{useContext as T,useRef as M,useEffect as z,useState as k,useCallback as C}from"react";import S,{ThemeContext as E,keyframes as I}from"styled-components";import"@lifesg/react-design-system/markup";import Z from"react-dom/server";import{Typography as A}from"@lifesg/react-design-system/typography";import{NavigationIcon as O}from"@lifesg/react-icons/navigation";import{NavigationFillIcon as B}from"@lifesg/react-icons/navigation-fill";import{PinFillIcon as N}from"@lifesg/react-icons/pin-fill";import{Card as R}from"@lifesg/react-design-system/card";import{CrossIcon as D}from"@lifesg/react-icons/cross";import{MagnifierIcon as j}from"@lifesg/react-icons/magnifier";import{Button as $}from"@lifesg/react-design-system/button";import"@lifesg/react-design-system/alert";import"@lifesg/react-design-system/layout";import"@lifesg/react-design-system/box-container";import"@lifesg/react-design-system/divider";import"@lifesg/react-design-system/v2_media";import"@lifesg/react-design-system/text-list";import"@lifesg/react-design-system/popover-v2";import"@lifesg/react-icons";import"@lifesg/react-design-system/tab";import"@lifesg/react-icons/plus-circle-fill";import"@lifesg/react-design-system/button-with-icon";import"@lifesg/react-design-system/error-display";import"@lifesg/react-design-system/filter";import"@lifesg/react-design-system/uneditable-section";import"@lifesg/react-design-system/timeline";import"@lifesg/react-design-system/form";import"@lifesg/react-design-system/checkbox";import"@lifesg/react-design-system/toggle";import"@lifesg/react-design-system/file-upload";import"@lifesg/react-design-system/icon-button";import"@lifesg/react-icons/bin";import"@lifesg/react-icons/eraser";import"@lifesg/react-icons/pencil";import"@lifesg/react-icons/pencil-stroke";import"@lifesg/react-icons/plus";import"@lifesg/react-icons/exclamation-triangle";import"@lifesg/react-design-system/image-button";import"@lifesg/react-design-system/radio-button";import"@lifesg/react-design-system/v2_layout";const F="https://assets.life.gov.sg/web-frontend-engine/img/common/no-network.png";var W={exports:{}};
1
+ import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{Modal as i}from"@lifesg/react-design-system/modal";import{Colour as o,Font as r,Spacing as s,MediaQuery as a,Breakpoint as l,Border as h,Motion as c}from"@lifesg/react-design-system/theme";import{h as u,b as d,L as p,T as m,O as f,i as _,j as g,G as v,l as y,S as x,P as b,k as w,D as P}from"./index.b12f3d48.js";import{useContext as T,useRef as M,useEffect as z,useState as k,useCallback as C}from"react";import S,{ThemeContext as E,keyframes as I}from"styled-components";import"@lifesg/react-design-system/markup";import Z from"react-dom/server";import{Typography as A}from"@lifesg/react-design-system/typography";import{NavigationIcon as O}from"@lifesg/react-icons/navigation";import{NavigationFillIcon as B}from"@lifesg/react-icons/navigation-fill";import{PinFillIcon as N}from"@lifesg/react-icons/pin-fill";import{Card as R}from"@lifesg/react-design-system/card";import{CrossIcon as D}from"@lifesg/react-icons/cross";import{MagnifierIcon as j}from"@lifesg/react-icons/magnifier";import{Button as $}from"@lifesg/react-design-system/button";import"@lifesg/react-design-system/alert";import"@lifesg/react-design-system/layout";import"@lifesg/react-design-system/box-container";import"@lifesg/react-design-system/divider";import"@lifesg/react-design-system/v2_media";import"@lifesg/react-design-system/text-list";import"@lifesg/react-design-system/popover-v2";import"@lifesg/react-icons";import"@lifesg/react-design-system/tab";import"@lifesg/react-icons/plus-circle-fill";import"@lifesg/react-design-system/button-with-icon";import"@lifesg/react-design-system/error-display";import"@lifesg/react-design-system/filter";import"@lifesg/react-design-system/uneditable-section";import"@lifesg/react-design-system/timeline";import"@lifesg/react-design-system/form";import"@lifesg/react-design-system/checkbox";import"@lifesg/react-design-system/toggle";import"@lifesg/react-design-system/file-upload";import"@lifesg/react-design-system/icon-button";import"@lifesg/react-icons/bin";import"@lifesg/react-icons/eraser";import"@lifesg/react-icons/pencil";import"@lifesg/react-icons/pencil-stroke";import"@lifesg/react-icons/plus";import"@lifesg/react-icons/exclamation-triangle";import"@lifesg/react-design-system/image-button";import"@lifesg/react-design-system/radio-button";import"@lifesg/react-design-system/v2_layout";const F="https://assets.life.gov.sg/web-frontend-engine/img/common/no-network.png";var W={exports:{}};
2
2
  /* @preserve
3
3
  * Leaflet 1.9.4, a JS library for interactive maps. https://leafletjs.com
4
4
  * (c) 2010-2023 Vladimir Agafonkin, (c) 2010-2011 CloudMade
@@ -344,4 +344,4 @@ import{jsx as t,jsxs as e,Fragment as n}from"react/jsx-runtime";import{Modal as
344
344
  max-width: 16.5rem;
345
345
  }
346
346
  `,Ot=({id:n,cachedImage:i,refreshNetwork:o})=>e(St,{id:m.generateId(n,"no-internet-connectivity"),"data-testid":m.generateId(n,"no-internet-connectivity"),children:[t(Et,{src:i,alt:"no-connectivity"}),t(It,{weight:"semibold",children:"No connection found"}),t(Zt,{children:"Check your internet connection and try again."}),t(At,{onClick:o,children:"Try again"})]}),Bt=({id:o="location-modal",className:r,formValues:s,showLocationModal:a,mapPanZoom:h,interactiveMapPinIconUrl:c,reverseGeoCodeEndpoint:u,convertLatLngToXYEndpoint:p,gettingCurrentLocationFetchMessage:_,mapBannerText:g,mustHavePostalCode:x,locationModalStyles:L,onClose:S,onConfirm:I,updateFormValues:Z,locationListTitle:A,locationSelectionMode:O,disableSearch:B,addressFieldPlaceholder:N,searchBarIcon:R,bufferRadius:D,pinsOnlyIndicateCurrentLocation:j})=>{const[$,W]=k("double"),[H,V]=k({}),[U,G]=k([]),[q,K]=k(!0),[Y,et]=k(!1),{dispatchFieldEvent:nt,addFieldEventListener:it,removeFieldEventListener:ot}=d(),[rt,st]=k(!0),[at,lt]=k(!1),[ht,ct]=k(!1),[ut,dt]=k(!1),[pt,mt]=k(),[ft,_t]=k(),gt=M(!0),vt=T(E),yt=C(((t,e)=>{W((n=>"double"===n||e&&n!==e?n:t))}),[]),xt=C((async()=>{et(!0);if(!!nt("get-current-location",o)){const t={};try{t.payload=await w.getCurrentLocation()}catch(e){t.errors=e}return nt("set-current-location",o,t),t.payload}}),[nt,o]),bt=C((()=>{V(s||{})}),[s]),wt=C((()=>{gt.current=!0,S()}),[S]),Lt=C((()=>{bt(),wt()}),[wt,bt]),Pt=C((t=>{const e=y.exports.isEmpty(t?.detail)?H:t?.detail;I(e),wt()}),[wt,I,H]),Tt=()=>{!nt("before-hide-permission-modal",o)||lt(!1)};z((()=>{const t={"error-end":t=>{const e=t.detail?.payload?.errorType;if(e)switch(e){case"OneMapError":case"GetLocationTimeoutError":wt()}},"set-selectable-pins":t=>{const e=t.detail.pins;Array.isArray(e)?G(e):ct(!0)},"confirm-location":Pt,"hide-permission-modal":()=>{lt(!1)},"dismiss-location-modal":Lt,"trigger-get-current-location":xt};return Object.entries(t).forEach((([t,e])=>{it(t,o,e)})),()=>{Object.entries(t).forEach((([t,e])=>{ot(t,o,e)}))}}),[it,xt,Lt,wt,Pt,o,ot]),z((()=>{if(!window)return;const t=matchMedia(`(max-width: ${l["lg-max"]({theme:vt})}px)`);W(t.matches?"map":"double");const e=()=>st(!0),n=()=>st(!1),i=t=>{W(t.matches?"map":"double")};return window.addEventListener("online",e),window.addEventListener("offline",n),t.addEventListener("change",i),()=>{window.removeEventListener("online",e),window.removeEventListener("offline",n),t.removeEventListener("change",i)}}),[]),z((()=>{if(!a)return void W((t=>"double"!==t?"map":t));(async()=>{const{lat:t,lng:e}=s||{};t||e?gt.current&&nt("get-selectable-pins",o,{lat:t,lng:e}):await xt(),gt.current=!1})()}),[nt,s,xt,o,a]),z((()=>{y.exports.isEmpty(H)||yt("map","search")}),[H,Y,yt]),z((()=>{V(s||{})}),[s]);return e(n,{children:[t(tt,{src:F,alt:"no internet connectivity"}),t(i,{id:m.generateId(o,"modal",a?"show":"hide"),className:`${r}-location-modal`,show:a,children:t(X,{id:m.generateId(o,"modal-box"),className:`${r}-modal-box`,showCloseButton:!1,locationModalStyles:L,children:rt?e(n,{children:[t(Ct,{id:o,className:r,onCancel:Lt,onConfirm:()=>{!nt("click-confirm-location",o,H)||Pt()},updateFormValues:Z,gettingCurrentLocation:Y,panelInputMode:$,selectedAddressInfo:H,mapPickedLatLng:pt,formValues:s,onChangeSelectedAddressInfo:V,handleApiErrors:t=>{const e=(e,n)=>{!nt("error",o,{payload:{errorType:e},errors:t})||n()};et(!1),t instanceof f?e("OneMapError",(()=>{bt(),ct(!0)})):(K(!1),t instanceof v&&t?.code?.toString()===GeolocationPositionError.TIMEOUT.toString()?e("GetLocationTimeoutError",(()=>{dt(!0)})):e("GetLocationError",(()=>{lt(!0)})))},onGetLocationCallback:(t,e)=>{et(!1),K(!0),_t({lat:t,lng:e})},setSinglePanelMode:yt,showLocationModal:a,reverseGeoCodeEndpoint:u,convertLatLngToXYEndpoint:p,gettingCurrentLocationFetchMessage:_,mustHavePostalCode:x,locationListTitle:A,restrictLocationSelection:"pins-only"===O,selectablePins:U,disableSearch:B,addressFieldPlaceholder:N,searchBarIcon:R,bufferRadius:D}),t(J,{id:o,className:r,panelInputMode:$,locationAvailable:q,gettingCurrentLocation:Y,showLocationModal:a,selectedLocationCoord:{lat:H.lat,lng:H.lng},getCurrentLocation:xt,onMapCenterChange:t=>{mt(t)},interactiveMapPinIconUrl:c,mapPanZoom:h,mapBannerText:g,disableSelectionFromMap:"pins-only"===O,disableSelectedLocationMarker:"pins-only"===O,selectablePins:U,pinsOnlyIndicateCurrentLocation:j&&"pins-only"===O,currentLocation:ft})]}):t(Ot,{id:o,cachedImage:F,refreshNetwork:()=>{try{navigator.onLine&&st(!0)}catch(t){}}})})}),(()=>{if(rt&&a)return ht?t(b,{id:m.generateId(o,"onemap-error"),"data-testid":m.generateId(o,"onemap-error"),title:"Map not available",size:"large",show:!0,image:t(Q,{src:"https://assets.life.gov.sg/web-frontend-engine/img/common/error.svg"}),description:e(P,{weight:"regular",children:["Sorry, there was a problem with the map. You’ll not be able to enter the location right now. Please try again later.",t("br",{}),t("br",{}),"Do note that you’ll not be able to submit your report without entering the location."]}),buttons:[{id:"ok",title:"OK",onClick:()=>{ct(!1),wt()}}]}):at?t(b,{id:m.generateId(o,"get-location-error"),"data-testid":m.generateId(o,"get-location-error"),title:"Enable location settings",size:"large",show:!0,description:"We need your permission to determine your location. Enable location access in your browser and device settings, or enter your location manually.",buttons:[{id:"ok",title:"OK",onClick:Tt}]}):ut?t(b,{id:m.generateId(o,"get-location-timeout-error"),"data-testid":m.generateId(o,"get-location-timeout-error"),title:"Something went wrong",size:"large",show:!0,image:t(Q,{src:"https://assets.life.gov.sg/web-frontend-engine/img/icons/get-location-timeout.svg"}),description:t(P,{weight:"regular",children:"It’s taking longer than expected to retrieve your location. Please exit the map and try again."}),buttons:[{id:"ok",title:"OK",onClick:()=>{dt(!1),wt()}}]}):void 0})()]})};export{Bt as default};
347
- //# sourceMappingURL=location-modal.422d3eb2.js.map
347
+ //# sourceMappingURL=location-modal.196e1cc7.js.map