@lifesg/web-frontend-engine 2.2.4 → 2.2.5

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 (335) hide show
  1. package/chunks/file-upload-manager.817b80cc.js +2 -0
  2. package/chunks/file-upload-manager.817b80cc.js.map +1 -0
  3. package/chunks/{index.ac3b6195.js → index.44b5e2a5.js} +10 -10
  4. package/chunks/{index.ac3b6195.js.map → index.44b5e2a5.js.map} +1 -1
  5. package/chunks/{index.a24b1857.js → index.51ad1607.js} +2 -2
  6. package/chunks/{index.a24b1857.js.map → index.51ad1607.js.map} +1 -1
  7. package/chunks/{index.8edac70b.js → index.f1de2e77.js} +2 -2
  8. package/chunks/{index.8edac70b.js.map → index.f1de2e77.js.map} +1 -1
  9. package/chunks/{location-modal.6475a4db.js → location-modal.1859f93a.js} +2 -2
  10. package/chunks/{location-modal.6475a4db.js.map → location-modal.1859f93a.js.map} +1 -1
  11. package/cjs/chunks/file-upload-manager.85af8429.js +2 -0
  12. package/cjs/chunks/file-upload-manager.85af8429.js.map +1 -0
  13. package/cjs/chunks/{index.d136a8bd.js → index.48f1a1f1.js} +2 -2
  14. package/cjs/chunks/{index.d136a8bd.js.map → index.48f1a1f1.js.map} +1 -1
  15. package/cjs/chunks/{index.6a929030.js → index.c2370225.js} +7 -7
  16. package/cjs/chunks/{index.6a929030.js.map → index.c2370225.js.map} +1 -1
  17. package/cjs/chunks/{index.6e0e20f7.js → index.efc005fc.js} +2 -2
  18. package/cjs/chunks/{index.6e0e20f7.js.map → index.efc005fc.js.map} +1 -1
  19. package/cjs/chunks/{location-modal.e5989ca3.js → location-modal.6885ccea.js} +2 -2
  20. package/cjs/chunks/{location-modal.e5989ca3.js.map → location-modal.6885ccea.js.map} +1 -1
  21. package/cjs/index.js +1 -1
  22. package/components/custom/array-field/array-field-element.d.ts +10 -11
  23. package/components/custom/array-field/array-field.d.ts +3 -3
  24. package/components/custom/array-field/array-field.styles.d.ts +22 -23
  25. package/components/custom/array-field/index.d.ts +2 -2
  26. package/components/custom/array-field/types.d.ts +39 -39
  27. package/components/custom/filter/filter/filter.d.ts +3 -3
  28. package/components/custom/filter/filter/types.d.ts +12 -12
  29. package/components/custom/filter/filter-checkbox/filter-checkbox.d.ts +3 -3
  30. package/components/custom/filter/filter-checkbox/types.d.ts +23 -23
  31. package/components/custom/filter/filter-helper.d.ts +8 -8
  32. package/components/custom/filter/filter-item/filter-item.d.ts +3 -3
  33. package/components/custom/filter/filter-item/types.d.ts +13 -13
  34. package/components/custom/filter/index.d.ts +3 -3
  35. package/components/custom/filter/types.d.ts +11 -11
  36. package/components/custom/iframe/iframe.d.ts +3 -3
  37. package/components/custom/iframe/index.d.ts +2 -2
  38. package/components/custom/iframe/types.d.ts +28 -29
  39. package/components/custom/index.d.ts +6 -6
  40. package/components/custom/review/index.d.ts +2 -2
  41. package/components/custom/review/review.d.ts +3 -3
  42. package/components/custom/review/review.styles.d.ts +12 -13
  43. package/components/custom/review/types.d.ts +60 -60
  44. package/components/custom/timeline/index.d.ts +2 -2
  45. package/components/custom/timeline/timeline.d.ts +3 -3
  46. package/components/custom/timeline/types.d.ts +19 -19
  47. package/components/custom/types.d.ts +87 -87
  48. package/components/elements/accordion/accordion.d.ts +6 -6
  49. package/components/elements/accordion/accordion.styles.d.ts +1 -2
  50. package/components/elements/accordion/index.d.ts +2 -2
  51. package/components/elements/accordion/types.d.ts +27 -27
  52. package/components/elements/alert/alert.d.ts +3 -3
  53. package/components/elements/alert/index.d.ts +2 -2
  54. package/components/elements/alert/types.d.ts +9 -10
  55. package/components/elements/divider/divider.d.ts +3 -3
  56. package/components/elements/divider/index.d.ts +2 -2
  57. package/components/elements/divider/types.d.ts +6 -6
  58. package/components/elements/grid/grid.d.ts +3 -3
  59. package/components/elements/grid/index.d.ts +2 -2
  60. package/components/elements/grid/types.d.ts +11 -11
  61. package/components/elements/index.d.ts +9 -9
  62. package/components/elements/list/data.d.ts +3 -3
  63. package/components/elements/list/index.d.ts +3 -3
  64. package/components/elements/list/list-item.d.ts +3 -3
  65. package/components/elements/list/list.d.ts +3 -3
  66. package/components/elements/list/types.d.ts +17 -17
  67. package/components/elements/popover/index.d.ts +2 -2
  68. package/components/elements/popover/popover.d.ts +3 -3
  69. package/components/elements/popover/types.d.ts +15 -15
  70. package/components/elements/section/index.d.ts +2 -2
  71. package/components/elements/section/section.d.ts +2 -2
  72. package/components/elements/section/section.styles.d.ts +11 -12
  73. package/components/elements/section/types.d.ts +16 -16
  74. package/components/elements/sections/index.d.ts +1 -1
  75. package/components/elements/sections/sections.d.ts +13 -13
  76. package/components/elements/tab/index.d.ts +2 -2
  77. package/components/elements/tab/tab.d.ts +3 -3
  78. package/components/elements/tab/types.d.ts +23 -23
  79. package/components/elements/text/data.d.ts +121 -122
  80. package/components/elements/text/index.d.ts +2 -2
  81. package/components/elements/text/text.d.ts +3 -3
  82. package/components/elements/text/types.d.ts +18 -18
  83. package/components/elements/types.d.ts +97 -97
  84. package/components/elements/wrapper/col-wrapper.d.ts +12 -12
  85. package/components/elements/wrapper/conditional-renderer.d.ts +16 -16
  86. package/components/elements/wrapper/field-wrapper.d.ts +9 -10
  87. package/components/elements/wrapper/index.d.ts +2 -2
  88. package/components/elements/wrapper/types.d.ts +29 -30
  89. package/components/elements/wrapper/wrapper.d.ts +2 -3
  90. package/components/fields/button/button.d.ts +3 -3
  91. package/components/fields/button/index.d.ts +2 -2
  92. package/components/fields/button/types.d.ts +17 -17
  93. package/components/fields/checkbox-group/checkbox-group.d.ts +3 -3
  94. package/components/fields/checkbox-group/checkbox-group.styles.d.ts +23 -24
  95. package/components/fields/checkbox-group/index.d.ts +2 -2
  96. package/components/fields/checkbox-group/types.d.ts +33 -33
  97. package/components/fields/chips/chips.d.ts +3 -3
  98. package/components/fields/chips/chips.styles.d.ts +5 -6
  99. package/components/fields/chips/index.d.ts +2 -2
  100. package/components/fields/chips/types.d.ts +18 -19
  101. package/components/fields/contact-field/contact-field.d.ts +3 -3
  102. package/components/fields/contact-field/data.d.ts +6 -6
  103. package/components/fields/contact-field/index.d.ts +2 -2
  104. package/components/fields/contact-field/types.d.ts +31 -31
  105. package/components/fields/contact-field/utils.d.ts +7 -7
  106. package/components/fields/date-field/date-field.d.ts +3 -3
  107. package/components/fields/date-field/index.d.ts +2 -2
  108. package/components/fields/date-field/types.d.ts +20 -20
  109. package/components/fields/date-range-field/date-range-field.d.ts +3 -3
  110. package/components/fields/date-range-field/index.d.ts +2 -2
  111. package/components/fields/date-range-field/types.d.ts +32 -32
  112. package/components/fields/e-signature-field/e-signature-field.d.ts +3 -3
  113. package/components/fields/e-signature-field/e-signature-field.styles.d.ts +4 -5
  114. package/components/fields/e-signature-field/index.d.ts +2 -2
  115. package/components/fields/e-signature-field/types.d.ts +22 -22
  116. package/components/fields/error-field/error-field.d.ts +3 -3
  117. package/components/fields/error-field/index.d.ts +2 -2
  118. package/components/fields/error-field/types.d.ts +11 -11
  119. package/components/fields/file-upload/file-upload-context.d.ts +14 -14
  120. package/components/fields/file-upload/file-upload-helper.d.ts +10 -10
  121. package/components/fields/file-upload/file-upload-manager.d.ts +14 -14
  122. package/components/fields/file-upload/file-upload.d.ts +4 -4
  123. package/components/fields/file-upload/index.d.ts +2 -2
  124. package/components/fields/file-upload/types.d.ts +78 -78
  125. package/components/fields/hidden-field/hidden-field.d.ts +3 -3
  126. package/components/fields/hidden-field/index.d.ts +2 -2
  127. package/components/fields/hidden-field/types.d.ts +29 -29
  128. package/components/fields/histogram-slider/histogram-slider.d.ts +3 -3
  129. package/components/fields/histogram-slider/index.d.ts +2 -2
  130. package/components/fields/histogram-slider/types.d.ts +20 -20
  131. package/components/fields/image-upload/image-context/image-context.d.ts +16 -16
  132. package/components/fields/image-upload/image-context/index.d.ts +1 -1
  133. package/components/fields/image-upload/image-input/drag-upload/drag-upload.d.ts +2 -3
  134. package/components/fields/image-upload/image-input/drag-upload/drag-upload.styles.d.ts +14 -15
  135. package/components/fields/image-upload/image-input/drag-upload/index.d.ts +2 -2
  136. package/components/fields/image-upload/image-input/drag-upload/types.d.ts +15 -16
  137. package/components/fields/image-upload/image-input/file-item/file-item.d.ts +11 -11
  138. package/components/fields/image-upload/image-input/file-item/file-item.styles.d.ts +48 -49
  139. package/components/fields/image-upload/image-input/file-item/index.d.ts +1 -1
  140. package/components/fields/image-upload/image-input/image-input.d.ts +26 -26
  141. package/components/fields/image-upload/image-input/image-input.styles.d.ts +47 -48
  142. package/components/fields/image-upload/image-input/index.d.ts +1 -1
  143. package/components/fields/image-upload/image-manager/image-manager.d.ts +25 -25
  144. package/components/fields/image-upload/image-manager/index.d.ts +2 -2
  145. package/components/fields/image-upload/image-review/image-editor/image-editor.d.ts +2 -3
  146. package/components/fields/image-upload/image-review/image-editor/image-editor.styles.d.ts +6 -7
  147. package/components/fields/image-upload/image-review/image-editor/index.d.ts +3 -3
  148. package/components/fields/image-upload/image-review/image-editor/types.d.ts +17 -17
  149. package/components/fields/image-upload/image-review/image-error/image-error.d.ts +10 -10
  150. package/components/fields/image-upload/image-review/image-error/image-error.styles.d.ts +31 -32
  151. package/components/fields/image-upload/image-review/image-error/index.d.ts +1 -1
  152. package/components/fields/image-upload/image-review/image-prompts/image-prompts.d.ts +11 -11
  153. package/components/fields/image-upload/image-review/image-prompts/index.d.ts +1 -1
  154. package/components/fields/image-upload/image-review/image-review.d.ts +18 -18
  155. package/components/fields/image-upload/image-review/image-review.styles.d.ts +128 -129
  156. package/components/fields/image-upload/image-review/image-thumbnails/image-thumbnails.d.ts +11 -11
  157. package/components/fields/image-upload/image-review/image-thumbnails/image-thumbnails.styles.d.ts +29 -30
  158. package/components/fields/image-upload/image-review/image-thumbnails/index.d.ts +1 -1
  159. package/components/fields/image-upload/image-review/index.d.ts +1 -1
  160. package/components/fields/image-upload/image-upload-helper.d.ts +12 -10
  161. package/components/fields/image-upload/image-upload.d.ts +4 -4
  162. package/components/fields/image-upload/index.d.ts +2 -2
  163. package/components/fields/image-upload/types.d.ts +151 -151
  164. package/components/fields/index.d.ts +30 -30
  165. package/components/fields/location-field/index.d.ts +2 -2
  166. package/components/fields/location-field/location-field.d.ts +3 -3
  167. package/components/fields/location-field/location-helper.d.ts +38 -39
  168. package/components/fields/location-field/location-input/dummy-location-field.d.ts +13 -14
  169. package/components/fields/location-field/location-input/index.d.ts +1 -1
  170. package/components/fields/location-field/location-input/location-input.d.ts +6 -7
  171. package/components/fields/location-field/location-input/location-input.styles.d.ts +22 -23
  172. package/components/fields/location-field/location-modal/infinite-scroll/index.d.ts +1 -1
  173. package/components/fields/location-field/location-modal/infinite-scroll/infinite-scroll.d.ts +11 -12
  174. package/components/fields/location-field/location-modal/infinite-scroll/infinite-scroll.style.d.ts +1 -2
  175. package/components/fields/location-field/location-modal/infinite-scroll/loading-indicator/config.d.ts +5 -5
  176. package/components/fields/location-field/location-modal/infinite-scroll/loading-indicator/index.d.ts +1 -1
  177. package/components/fields/location-field/location-modal/infinite-scroll/loading-indicator/loading-indicator.d.ts +5 -5
  178. package/components/fields/location-field/location-modal/infinite-scroll/loading-indicator/loading-indicator.styles.d.ts +2 -3
  179. package/components/fields/location-field/location-modal/location-modal.d.ts +8 -8
  180. package/components/fields/location-field/location-modal/location-modal.data.d.ts +3 -3
  181. package/components/fields/location-field/location-modal/location-modal.styles.d.ts +16 -17
  182. package/components/fields/location-field/location-modal/location-picker/helper.d.ts +4 -4
  183. package/components/fields/location-field/location-modal/location-picker/index.d.ts +1 -1
  184. package/components/fields/location-field/location-modal/location-picker/legend/index.d.ts +1 -1
  185. package/components/fields/location-field/location-modal/location-picker/legend/legend.d.ts +8 -8
  186. package/components/fields/location-field/location-modal/location-picker/legend/legend.styles.d.ts +10 -11
  187. package/components/fields/location-field/location-modal/location-picker/location-picker.d.ts +3 -3
  188. package/components/fields/location-field/location-modal/location-picker/location-picker.styles.d.ts +17 -18
  189. package/components/fields/location-field/location-modal/location-picker/types.d.ts +34 -35
  190. package/components/fields/location-field/location-modal/location-search/helper.d.ts +14 -14
  191. package/components/fields/location-field/location-modal/location-search/index.d.ts +1 -1
  192. package/components/fields/location-field/location-modal/location-search/location-search.d.ts +2 -2
  193. package/components/fields/location-field/location-modal/location-search/location-search.styles.d.ts +84 -85
  194. package/components/fields/location-field/location-modal/location-search/types.d.ts +30 -30
  195. package/components/fields/location-field/location-modal/no-network-modal/no-network-modal.d.ts +7 -7
  196. package/components/fields/location-field/location-modal/no-network-modal/no-network-modal.styles.d.ts +29 -30
  197. package/components/fields/location-field/location-modal/types.d.ts +18 -18
  198. package/components/fields/location-field/types.d.ts +163 -163
  199. package/components/fields/masked-field/index.d.ts +2 -2
  200. package/components/fields/masked-field/masked-field.d.ts +3 -3
  201. package/components/fields/masked-field/types.d.ts +12 -12
  202. package/components/fields/multi-select/index.d.ts +2 -2
  203. package/components/fields/multi-select/multi-select.d.ts +3 -3
  204. package/components/fields/multi-select/types.d.ts +9 -9
  205. package/components/fields/nested-multi-select/index.d.ts +2 -2
  206. package/components/fields/nested-multi-select/nested-multi-select.d.ts +3 -3
  207. package/components/fields/nested-multi-select/types.d.ts +33 -34
  208. package/components/fields/otp-verification-field/index.d.ts +2 -2
  209. package/components/fields/otp-verification-field/otp-verification-field.d.ts +3 -3
  210. package/components/fields/otp-verification-field/types.d.ts +46 -46
  211. package/components/fields/radio-button/index.d.ts +2 -2
  212. package/components/fields/radio-button/radio-button.d.ts +3 -3
  213. package/components/fields/radio-button/radio-button.styles.d.ts +29 -30
  214. package/components/fields/radio-button/types.d.ts +41 -41
  215. package/components/fields/range-select/index.d.ts +2 -2
  216. package/components/fields/range-select/range-select.d.ts +3 -3
  217. package/components/fields/range-select/types.d.ts +9 -9
  218. package/components/fields/reset-button/index.d.ts +2 -2
  219. package/components/fields/reset-button/reset-button.d.ts +3 -3
  220. package/components/fields/reset-button/types.d.ts +8 -8
  221. package/components/fields/select/index.d.ts +2 -2
  222. package/components/fields/select/select.d.ts +3 -3
  223. package/components/fields/select/types.d.ts +9 -9
  224. package/components/fields/select-histogram/index.d.ts +2 -2
  225. package/components/fields/select-histogram/select-histogram.d.ts +3 -3
  226. package/components/fields/select-histogram/types.d.ts +17 -17
  227. package/components/fields/slider/index.d.ts +2 -2
  228. package/components/fields/slider/slider.d.ts +3 -3
  229. package/components/fields/slider/types.d.ts +11 -11
  230. package/components/fields/submit-button/index.d.ts +2 -2
  231. package/components/fields/submit-button/submit-button.d.ts +3 -3
  232. package/components/fields/submit-button/types.d.ts +7 -7
  233. package/components/fields/switch/index.d.ts +2 -2
  234. package/components/fields/switch/switch.d.ts +3 -3
  235. package/components/fields/switch/switch.styles.d.ts +1 -2
  236. package/components/fields/switch/types.d.ts +10 -10
  237. package/components/fields/text-field/index.d.ts +2 -2
  238. package/components/fields/text-field/text-field.d.ts +3 -3
  239. package/components/fields/text-field/types.d.ts +37 -37
  240. package/components/fields/textarea/index.d.ts +2 -2
  241. package/components/fields/textarea/textarea.d.ts +3 -3
  242. package/components/fields/textarea/textarea.styles.d.ts +19 -20
  243. package/components/fields/textarea/types.d.ts +8 -8
  244. package/components/fields/time-field/index.d.ts +2 -2
  245. package/components/fields/time-field/time-field.d.ts +3 -3
  246. package/components/fields/time-field/types.d.ts +7 -7
  247. package/components/fields/types.d.ts +122 -122
  248. package/components/fields/unit-number-field/index.d.ts +2 -2
  249. package/components/fields/unit-number-field/types.d.ts +8 -8
  250. package/components/fields/unit-number-field/unit-number-field.d.ts +3 -3
  251. package/components/frontend-engine/frontend-engine.d.ts +23 -23
  252. package/components/frontend-engine/index.d.ts +2 -2
  253. package/components/frontend-engine/types.d.ts +213 -214
  254. package/components/frontend-engine/use-form-change.d.ts +12 -12
  255. package/components/index.d.ts +2 -2
  256. package/components/shared/chip/chip.d.ts +6 -6
  257. package/components/shared/chip/chip.styles.d.ts +16 -17
  258. package/components/shared/chip/index.d.ts +2 -2
  259. package/components/shared/chip/types.d.ts +4 -4
  260. package/components/shared/error-messages.d.ts +102 -102
  261. package/components/shared/index.d.ts +6 -6
  262. package/components/shared/prompt/index.d.ts +2 -2
  263. package/components/shared/prompt/prompt.d.ts +2 -2
  264. package/components/shared/prompt/prompt.styles.d.ts +40 -41
  265. package/components/shared/prompt/types.d.ts +16 -16
  266. package/components/shared/sanitize/index.d.ts +1 -1
  267. package/components/shared/sanitize/sanitize.d.ts +13 -14
  268. package/components/shared/static-map/index.d.ts +1 -1
  269. package/components/shared/static-map/static-map.d.ts +12 -12
  270. package/components/shared/static-map/static-map.styles.d.ts +12 -13
  271. package/components/shared/warning/index.d.ts +1 -1
  272. package/components/shared/warning/warning.d.ts +6 -6
  273. package/components/types.d.ts +4 -4
  274. package/context-providers/context-providers.d.ts +7 -7
  275. package/context-providers/custom-components/context-provider.d.ts +14 -14
  276. package/context-providers/custom-components/index.d.ts +1 -1
  277. package/context-providers/event/context-provider.d.ts +14 -14
  278. package/context-providers/event/index.d.ts +2 -2
  279. package/context-providers/event/types.d.ts +10 -10
  280. package/context-providers/form-schema/context-provider.d.ts +12 -12
  281. package/context-providers/form-schema/index.d.ts +1 -1
  282. package/context-providers/form-values/context-provider.d.ts +23 -23
  283. package/context-providers/form-values/index.d.ts +1 -1
  284. package/context-providers/frontend-engine-form/context-provider.d.ts +13 -13
  285. package/context-providers/frontend-engine-form/index.d.ts +1 -1
  286. package/context-providers/index.d.ts +7 -7
  287. package/context-providers/recaptcha/index.d.ts +3 -3
  288. package/context-providers/recaptcha/recaptcha-hook.d.ts +5 -5
  289. package/context-providers/recaptcha/recaptcha-provider.d.ts +10 -11
  290. package/context-providers/recaptcha/types.d.ts +14 -14
  291. package/context-providers/yup/context-provider.d.ts +16 -16
  292. package/context-providers/yup/custom-conditions/html-safe.d.ts +1 -1
  293. package/context-providers/yup/custom-conditions/index.d.ts +3 -3
  294. package/context-providers/yup/custom-conditions/uen.d.ts +1 -1
  295. package/context-providers/yup/custom-conditions/uinfin.d.ts +1 -1
  296. package/context-providers/yup/helper.d.ts +44 -44
  297. package/context-providers/yup/index.d.ts +4 -4
  298. package/context-providers/yup/types.d.ts +82 -82
  299. package/index.d.ts +3 -3
  300. package/index.js +1 -1
  301. package/package.json +1 -1
  302. package/services/index.d.ts +1 -1
  303. package/services/onemap/onemap-service.d.ts +21 -21
  304. package/services/onemap/types.d.ts +48 -48
  305. package/utils/api-client/api-client.d.ts +65 -65
  306. package/utils/api-client/index.d.ts +1 -1
  307. package/utils/date-time-helper.d.ts +22 -22
  308. package/utils/file-helper.d.ts +45 -47
  309. package/utils/geolocation-helper.d.ts +17 -17
  310. package/utils/hooks/index.d.ts +12 -12
  311. package/utils/hooks/use-custom-components.d.ts +5 -6
  312. package/utils/hooks/use-deep-layout-effect.d.ts +3 -3
  313. package/utils/hooks/use-field-event.d.ts +10 -10
  314. package/utils/hooks/use-form-schema.d.ts +6 -7
  315. package/utils/hooks/use-form-values.d.ts +11 -12
  316. package/utils/hooks/use-frontend-engine-component.d.ts +17 -17
  317. package/utils/hooks/use-frontend-engine-form.d.ts +6 -7
  318. package/utils/hooks/use-iframe-message.d.ts +5 -5
  319. package/utils/hooks/use-previous.d.ts +4 -4
  320. package/utils/hooks/use-validation-config.d.ts +10 -10
  321. package/utils/hooks/use-validation-schema.d.ts +15 -15
  322. package/utils/hooks/use-window-helper.d.ts +1 -1
  323. package/utils/id-helper.d.ts +1 -1
  324. package/utils/image-helper.d.ts +49 -49
  325. package/utils/index.d.ts +11 -11
  326. package/utils/math-helper.d.ts +5 -5
  327. package/utils/object-helper.d.ts +15 -15
  328. package/utils/prop-helper.d.ts +8 -8
  329. package/utils/test-helper.d.ts +4 -4
  330. package/utils/ts-helper.d.ts +1 -1
  331. package/utils/types.d.ts +9 -9
  332. package/chunks/file-upload-manager.ddb44c1f.js +0 -2
  333. package/chunks/file-upload-manager.ddb44c1f.js.map +0 -1
  334. package/cjs/chunks/file-upload-manager.b22d56d4.js +0 -2
  335. package/cjs/chunks/file-upload-manager.b22d56d4.js.map +0 -1
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("react"),i=require("./index.c2370225.js");require("react/jsx-runtime"),require("@lifesg/react-design-system/theme"),require("styled-components"),require("@lifesg/react-design-system/markup"),require("react-dom/server"),require("@lifesg/react-design-system/typography"),require("@lifesg/react-design-system/button"),require("@lifesg/react-design-system/modal"),require("@lifesg/react-design-system/alert"),require("@lifesg/react-design-system/layout"),require("@lifesg/react-design-system/box-container"),require("@lifesg/react-design-system/divider"),require("@lifesg/react-design-system/v2_media"),require("@lifesg/react-design-system/text-list"),require("@lifesg/react-design-system/popover-v2"),require("@lifesg/react-icons"),require("@lifesg/react-design-system/tab"),require("@lifesg/react-icons/plus-circle-fill"),require("@lifesg/react-design-system/button-with-icon"),require("@lifesg/react-design-system/error-display"),require("@lifesg/react-design-system/filter"),require("@lifesg/react-design-system/uneditable-section"),require("@lifesg/react-design-system/timeline"),require("@lifesg/react-design-system/form"),require("@lifesg/react-design-system/checkbox"),require("@lifesg/react-design-system/toggle"),require("@lifesg/react-icons/exclamation-circle-fill"),require("@lifesg/react-design-system/file-upload"),require("@lifesg/react-icons/cross"),require("@lifesg/react-design-system/icon-button"),require("@lifesg/react-icons/bin"),require("@lifesg/react-icons/eraser"),require("@lifesg/react-icons/pencil"),require("@lifesg/react-icons/pencil-stroke"),require("@lifesg/react-icons/plus"),require("@lifesg/react-icons/exclamation-triangle"),require("@lifesg/react-icons/pin-fill"),require("@lifesg/react-design-system/image-button"),require("@lifesg/react-design-system/radio-button"),require("@lifesg/react-design-system/v2_layout");const t=["image/jpeg","image/gif","image/png"];exports.default=s=>{const{compressImages:r,fileTypeRule:a,fileExtensionRule:l,hideThumbnail:n,id:o,maxFileSizeRule:u,upload:m,uploadRule:c,value:f}=s,{files:d,setFiles:g,setCurrentFileIds:p}=e.useContext(i.FileUploadContext),y=i.usePrevious(f),{setValue:E}=i.useFormContext(),{dispatchFieldEvent:F}=i.useFieldEvent(),I=e.useRef(!1),R=e.useRef(),w=e=>{I.current&&g(e)},q=e=>e.status===i.EFileStatus.UPLOADED&&"number"==typeof e.fileItem?.progress&&e.fileItem.progress<1,S=d.filter(q).map(e=>e.fileItem?.id).join(",");e.useEffect(()=>(I.current=!0,R.current=i.generateRandomId(),()=>{I.current=!1}),[]),e.useEffect(()=>{d.forEach(async(e,t)=>{try{switch(e.status){case i.EFileStatus.INJECTED:await x(e,t);break;case i.EFileStatus.NONE:await O(e,t);break;case i.EFileStatus.UPLOAD_READY:await A(e,t);break;case i.EFileStatus.TO_DELETE:M(t)}}catch(e){T(t)}});const e=d.filter(({status:e})=>e===i.EFileStatus.UPLOADED),t=e.filter(({addedFrom:e})=>"schema"!==e).length>0,s=d.filter(({status:e})=>e===i.EFileStatus.TO_DELETE).length>0,r=t||s;p(e.map(({fileItem:e})=>e.id)),E(o,e.map(({dataURL:e,fileItem:i,fileUrl:t,uploadResponse:s})=>({..."base64"===m.type?{dataURL:e}:{},fileId:i.id,fileName:i.name,fileUrl:t,uploadResponse:s})),{shouldDirty:r,shouldTouch:t})},[d.map(({fileItem:e,status:i})=>`${e?.id}-${i}`).join(",")]),e.useEffect(()=>{S&&w(e=>e.map(e=>q(e)?{...e,fileItem:{...e.fileItem,progress:1}}:e))},[S]),e.useEffect(()=>{void 0!==y&&void 0===f&&d.length&&g([])},[d,y,g,f]);const T=e=>{w(t=>{const s=[...t],r=t[e];return s[e]={...r,fileItem:{...r.fileItem,id:r.fileItem?.id||i.generateRandomId(),name:r.rawFile.name,errorMessage:c?.errorMessage||i.ERROR_MESSAGES.UPLOAD().GENERIC},status:i.EFileStatus.ERROR_GENERIC},s})},U=async(e,s)=>{if(!0!==n&&t.includes(s||e.fileItem?.type)){const t=await i.ImageHelper.dataUrlToImage(e.dataURL),s=await i.ImageHelper.resampleImage(t,{width:94,height:94,crop:!0});return await i.FileHelper.fileToDataUrl(s)}return""},b=async e=>{const{addedFrom:t,dataURL:s,rawFile:r}=e,n=await i.FileHelper.getType(r),o=D(n);if(o?.status<0)return o;if(a.fileType&&l.fileExtension){const e=h(r.name);if(e?.status<0)return{...e,fileType:n}}const u="base64"===m.type?i.FileHelper.getFilesizeFromBase64(s):r.size,{errorMessage:c,status:f}=L(u);return f<0?{errorMessage:c,fileType:n,status:f}:"schema"===t?{fileType:n,status:i.EFileStatus.UPLOADED}:{fileType:n,status:i.EFileStatus.UPLOAD_READY}},D=e=>!a.fileType?.length||a.fileType?.includes(e.ext)?{}:{errorMessage:a.errorMessage||i.ERROR_MESSAGES.UPLOAD().FILE_TYPE(a.fileType||[]),fileType:e,status:i.EFileStatus.ERROR_FORMAT},h=e=>{const t=e?.includes(".")?e.split(".").pop().toLowerCase():void 0;return t&&l?.fileExtension?.includes(t)?{}:{errorMessage:l.errorMessage||i.ERROR_MESSAGES.UPLOAD().FILE_EXTENSION(a.fileType||[]),fileName:e,status:i.EFileStatus.ERROR_FORMAT}},L=e=>{if(u.maxSizeInKb>0){if(e>1024*u.maxSizeInKb)return{errorMessage:u.errorMessage||i.ERROR_MESSAGES.UPLOAD().MAX_FILE_SIZE(u.maxSizeInKb),status:i.EFileStatus.ERROR_SIZE}}return{}},x=async(e,t)=>{let s;if(w(e=>{const s=[...e];return s[t]={...e[t],status:i.EFileStatus.INJECTING},s}),e.dataURL){const t=await i.FileHelper.dataUrlToBlob(e.dataURL);s=new File([t],e.rawFile.name)}else if(e.fileUrl){const t=await new i.AxiosApiClient("",void 0,void 0,!1,{responseType:"blob"}).get(e.fileUrl),r=await i.FileHelper.getType(new File([t],e.rawFile.name));s=new File([t],e.rawFile.name,{type:r.mime}),e.dataURL=await i.FileHelper.fileToDataUrl(s)}const r=e.uploadResponse?.data||e.uploadResponse,{errorMessage:a,fileType:l}=s?await b({...e,rawFile:s}):D({mime:r?.mimeType,ext:r?.ext});let n=s?.size||r?.fileSize||0;isNaN(n)&&(n=0);const{errorMessage:o}=L(n),u=s?await U(e,l?.mime):void 0;w(m=>{const c=[...m];return c[t]={...e,fileItem:{errorMessage:a||o,id:e.fileItem?.id||i.generateRandomId(),name:i.FileHelper.deduplicateFileName(d.map(({fileItem:e})=>e.name),t,s?.name||e.rawFile.name),progress:1,size:n,type:l?.mime||r?.mimeType,thumbnailImageDataUrl:u},rawFile:s,status:i.EFileStatus.UPLOADED},c})},O=async(e,t)=>{const s=await v(e),r=await i.FileHelper.fileToDataUrl(s.rawFile),{errorMessage:a,fileType:l,status:n}=await b({dataURL:r,...s});w(e=>{const o=[...e];return o[t]={...s,dataURL:r,fileItem:{errorMessage:a,id:i.generateRandomId(),name:i.FileHelper.deduplicateFileName(d.map(({fileItem:e})=>e?.name),t,i.FileHelper.sanitizeFileName(s.rawFile.name)),size:s.rawFile.size,type:l.mime,progress:0},status:n},o})},A=async(e,t)=>{w(e=>{const s=[...e];return s[t]={...e[t],status:i.EFileStatus.UPLOADING},s});const s=new FormData;s.append("sessionId",m?.sessionId||R.current||""),s.append("fileId",e.fileItem.id),s.append("slot",e.slot.toString()),"base64"===m.type?s.append("dataURL",e.dataURL):"multipart"===m.type&&s.append("file",e.rawFile,e.fileItem?.name);try{const r=await new i.AxiosApiClient("",void 0,void 0,!0).post(m.url,s,{headers:{"Content-Type":"base64"===m.type?"application/json":"multipart/form-data",...m.headers},onUploadProgress:e=>{const{loaded:i,total:s}=e;w(e=>{if(!e[t])return e;const r=[...e];return r[t]={...e[t],fileItem:{...e[t].fileItem,progress:Math.min(i/s,.99)}},r})}}),a=await U(e);w(e=>{if(!e[t])return e;const s=[...e];return s[t]={...e[t],fileItem:{...e[t].fileItem,progress:.99,thumbnailImageDataUrl:a},fileUrl:r?.data?.fileUrl,status:i.EFileStatus.UPLOADED,uploadResponse:r},s})}catch(i){throw F("upload-error",o,{fileId:e.fileItem.id,errorData:i?.response?.data}),i}},M=e=>{w(i=>i.filter((i,t)=>t!==e))},v=async e=>{if(u.maxSizeInKb>0&&r){const s=1024*u.maxSizeInKb;if(e.rawFile.size>s){const s=await i.FileHelper.getType(e.rawFile);if(t.includes(s.mime)){let t=await i.ImageHelper.compressImage(e.rawFile,{fileSize:u.maxSizeInKb});return t instanceof Blob&&(t=i.FileHelper.blobToFile(t,{name:e.rawFile.name,lastModified:e.rawFile.lastModified})),{...e,rawFile:t}}}}return e};return null};
2
+ //# sourceMappingURL=file-upload-manager.85af8429.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"file-upload-manager.85af8429.js","sources":["../../../src/components/fields/file-upload/file-upload-manager.ts"],"sourcesContent":["import { AxiosError } from \"axios\";\nimport { useContext, useEffect, useRef } from \"react\";\nimport { useFormContext } from \"react-hook-form\";\nimport { AxiosApiClient, FileHelper, ImageHelper, generateRandomId } from \"../../../utils\";\nimport { useFieldEvent, usePrevious } from \"../../../utils/hooks\";\nimport { ERROR_MESSAGES } from \"../../shared\";\nimport { FileUploadContext } from \"./file-upload-context\";\nimport {\n\tEFileStatus,\n\tIFile,\n\tIFileUploadSchema,\n\tIFileUploadValidationRule,\n\tIFileUploadValue,\n\tTUploadErrorDetail,\n} from \"./types\";\n\ninterface IProps {\n\tcompressImages: boolean;\n\tfileTypeRule: IFileUploadValidationRule;\n\tfileExtensionRule: IFileUploadValidationRule;\n\thideThumbnail?: boolean | undefined;\n\tid: string;\n\tmaxFileSizeRule: IFileUploadValidationRule;\n\tupload: IFileUploadSchema[\"uploadOnAddingFile\"];\n\tuploadRule: IFileUploadValidationRule;\n\tvalue: IFileUploadValue[];\n}\n\nconst RESIZEABLE_IMAGE_TYPES = [\"image/jpeg\", \"image/gif\", \"image/png\"];\n\nconst FileUploadManager = (props: IProps) => {\n\t// =============================================================================\n\t// CONST, STATE, REFS\n\t// =============================================================================\n\tconst {\n\t\tcompressImages,\n\t\tfileTypeRule,\n\t\tfileExtensionRule,\n\t\thideThumbnail,\n\t\tid,\n\t\tmaxFileSizeRule,\n\t\tupload,\n\t\tuploadRule,\n\t\tvalue,\n\t} = props;\n\tconst { files, setFiles, setCurrentFileIds } = useContext(FileUploadContext);\n\tconst previousValue = usePrevious(value);\n\tconst { setValue } = useFormContext();\n\tconst { dispatchFieldEvent } = useFieldEvent();\n\tconst isMounted = useRef(false);\n\tconst sessionId = useRef<string>();\n\tconst setFilesIfMounted: typeof setFiles = (value) => {\n\t\tif (isMounted.current) {\n\t\t\tsetFiles(value);\n\t\t}\n\t};\n\tconst isUploadedWithHeldProgress = (file: IFile) =>\n\t\tfile.status === EFileStatus.UPLOADED &&\n\t\ttypeof file.fileItem?.progress === \"number\" &&\n\t\tfile.fileItem.progress < 1;\n\n\tconst heldProgressFileIds = files\n\t\t.filter(isUploadedWithHeldProgress)\n\t\t.map((file) => file.fileItem?.id)\n\t\t.join(\",\");\n\n\t// =============================================================================\n\t// EFFECTS\n\t// =============================================================================\n\tuseEffect(() => {\n\t\tisMounted.current = true;\n\t\tsessionId.current = generateRandomId();\n\n\t\treturn () => {\n\t\t\tisMounted.current = false;\n\t\t};\n\t}, []);\n\n\tuseEffect(\n\t\t() => {\n\t\t\t// handle file status\n\t\t\tfiles.forEach(async (file, index) => {\n\t\t\t\ttry {\n\t\t\t\t\tswitch (file.status) {\n\t\t\t\t\t\tcase EFileStatus.INJECTED:\n\t\t\t\t\t\t\tawait injectFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.NONE:\n\t\t\t\t\t\t\tawait parseFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.UPLOAD_READY:\n\t\t\t\t\t\t\tawait uploadFile(file, index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase EFileStatus.TO_DELETE:\n\t\t\t\t\t\t\tdeleteFile(index);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t} catch (err) {\n\t\t\t\t\thandleGenericError(index);\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// track / update values\n\t\t\tconst uploadedFiles = files.filter(({ status }) => status === EFileStatus.UPLOADED);\n\t\t\tconst notPrefilledFiles = uploadedFiles.filter(({ addedFrom }) => addedFrom !== \"schema\");\n\t\t\tconst hasNotPrefilledFiles = notPrefilledFiles.length > 0;\n\t\t\tconst gotDeleteFiles = files.filter(({ status }) => status === EFileStatus.TO_DELETE).length > 0;\n\n\t\t\t/**\n\t\t\t * should dirty if\n\t\t\t * - it is dirty in the first place\n\t\t\t * - there are non-prefilled files\n\t\t\t * - user deleted file (differentiated from reset)\n\t\t\t */\n\t\t\tconst shouldDirty = hasNotPrefilledFiles || gotDeleteFiles;\n\n\t\t\tsetCurrentFileIds(uploadedFiles.map(({ fileItem }) => fileItem.id));\n\n\t\t\tsetValue(\n\t\t\t\tid,\n\t\t\t\tuploadedFiles.map(({ dataURL, fileItem, fileUrl, uploadResponse }) => ({\n\t\t\t\t\t...(upload.type === \"base64\" ? { dataURL } : {}),\n\t\t\t\t\tfileId: fileItem.id,\n\t\t\t\t\tfileName: fileItem.name,\n\t\t\t\t\tfileUrl,\n\t\t\t\t\tuploadResponse,\n\t\t\t\t})),\n\t\t\t\t{ shouldDirty, shouldTouch: hasNotPrefilledFiles }\n\t\t\t);\n\t\t}, // eslint-disable-next-line react-hooks/exhaustive-deps\n\t\t[files.map(({ fileItem, status }) => `${fileItem?.id}-${status}`).join(\",\")]\n\t);\n\n\t// release held progress to 1 — progress is UI-only and does not affect form validity\n\tuseEffect(() => {\n\t\tif (!heldProgressFileIds) return;\n\n\t\tsetFilesIfMounted((prev) =>\n\t\t\tprev.map((file) =>\n\t\t\t\tisUploadedWithHeldProgress(file)\n\t\t\t\t\t? {\n\t\t\t\t\t\t\t...file,\n\t\t\t\t\t\t\tfileItem: { ...file.fileItem!, progress: 1 },\n\t\t\t\t\t }\n\t\t\t\t\t: file\n\t\t\t)\n\t\t);\n\t\t// only re-runs when the set of UPLOADED files with progress < 1 actually changes\n\t\t// eslint-disable-next-line react-hooks/exhaustive-deps\n\t}, [heldProgressFileIds]);\n\n\t// for reset\n\tuseEffect(() => {\n\t\tif (previousValue !== undefined && value === undefined && files.length) {\n\t\t\tsetFiles([]);\n\t\t}\n\t}, [files, previousValue, setFiles, value]);\n\n\t// =============================================================================\n\t// HELPER FUNCTIONS\n\t// =============================================================================\n\n\tconst handleGenericError = (index: number) => {\n\t\tsetFilesIfMounted((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tconst file = prev[index];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...file,\n\t\t\t\tfileItem: {\n\t\t\t\t\t...file.fileItem,\n\t\t\t\t\tid: file.fileItem?.id || generateRandomId(),\n\t\t\t\t\tname: file.rawFile.name,\n\t\t\t\t\terrorMessage: uploadRule?.errorMessage || ERROR_MESSAGES.UPLOAD().GENERIC,\n\t\t\t\t},\n\t\t\t\tstatus: EFileStatus.ERROR_GENERIC,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst generateThumbnail = async (file: IFile, fileType?: string | undefined) => {\n\t\tif (hideThumbnail !== true && RESIZEABLE_IMAGE_TYPES.includes(fileType || file.fileItem?.type)) {\n\t\t\tconst image = await ImageHelper.dataUrlToImage(file.dataURL);\n\t\t\tconst thumbnail = await ImageHelper.resampleImage(image, { width: 94, height: 94, crop: true });\n\t\t\treturn await FileHelper.fileToDataUrl(thumbnail);\n\t\t}\n\t\treturn \"\";\n\t};\n\n\tconst readFile = async (fileToRead: IFile) => {\n\t\tconst { addedFrom, dataURL, rawFile } = fileToRead;\n\t\tconst fileType = await FileHelper.getType(rawFile);\n\t\tconst fileTypeResult = validateFileType(fileType);\n\n\t\tif (fileTypeResult?.status < 0) {\n\t\t\treturn fileTypeResult;\n\t\t}\n\n\t\tif (fileTypeRule.fileType && fileExtensionRule.fileExtension) {\n\t\t\tconst fileExtensionResult = validateFileExtension(rawFile.name);\n\t\t\tif (fileExtensionResult?.status < 0) {\n\t\t\t\treturn { ...fileExtensionResult, fileType };\n\t\t\t}\n\t\t}\n\n\t\tconst fileSize = upload.type === \"base64\" ? FileHelper.getFilesizeFromBase64(dataURL) : rawFile.size;\n\t\tconst { errorMessage, status } = validateFileSize(fileSize);\n\t\tif (status < 0) {\n\t\t\treturn { errorMessage, fileType, status };\n\t\t}\n\n\t\tif (addedFrom === \"schema\") {\n\t\t\treturn {\n\t\t\t\tfileType,\n\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tfileType,\n\t\t\tstatus: EFileStatus.UPLOAD_READY,\n\t\t};\n\t};\n\n\tconst validateFileType = (fileType: { mime: string; ext: string }) => {\n\t\tconst validFileType = fileTypeRule.fileType?.length ? fileTypeRule.fileType?.includes(fileType.ext) : true;\n\n\t\tif (!validFileType) {\n\t\t\treturn {\n\t\t\t\terrorMessage:\n\t\t\t\t\tfileTypeRule.errorMessage || ERROR_MESSAGES.UPLOAD().FILE_TYPE(fileTypeRule.fileType || []),\n\t\t\t\tfileType,\n\t\t\t\tstatus: EFileStatus.ERROR_FORMAT,\n\t\t\t};\n\t\t}\n\n\t\treturn {};\n\t};\n\n\tconst validateFileExtension = (fileName: string) => {\n\t\tconst extensionFromFilename = fileName?.includes(\".\") ? fileName.split(\".\").pop().toLowerCase() : undefined;\n\n\t\tif (!extensionFromFilename || !fileExtensionRule?.fileExtension?.includes(extensionFromFilename)) {\n\t\t\treturn {\n\t\t\t\terrorMessage:\n\t\t\t\t\tfileExtensionRule.errorMessage ||\n\t\t\t\t\tERROR_MESSAGES.UPLOAD().FILE_EXTENSION(fileTypeRule.fileType || []),\n\t\t\t\tfileName,\n\t\t\t\tstatus: EFileStatus.ERROR_FORMAT,\n\t\t\t};\n\t\t}\n\t\treturn {};\n\t};\n\n\tconst validateFileSize = (fileSizeInKb: number) => {\n\t\tif (maxFileSizeRule.maxSizeInKb > 0) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (fileSizeInKb > maxSizeInB) {\n\t\t\t\treturn {\n\t\t\t\t\terrorMessage:\n\t\t\t\t\t\tmaxFileSizeRule.errorMessage ||\n\t\t\t\t\t\tERROR_MESSAGES.UPLOAD().MAX_FILE_SIZE(maxFileSizeRule.maxSizeInKb),\n\t\t\t\t\tstatus: EFileStatus.ERROR_SIZE,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t\treturn {};\n\t};\n\n\t// =============================================================================\n\t// FILE STATUS HANDLERS\n\t// =============================================================================\n\tconst injectFile = async (fileToInject: IFile, index: number) => {\n\t\tsetFilesIfMounted((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...prev[index],\n\t\t\t\tstatus: EFileStatus.INJECTING,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\n\t\tlet rawFile: File;\n\t\tif (fileToInject.dataURL) {\n\t\t\tconst blob = await FileHelper.dataUrlToBlob(fileToInject.dataURL);\n\t\t\trawFile = new File([blob], fileToInject.rawFile.name);\n\t\t} else if (fileToInject.fileUrl) {\n\t\t\tconst response: Blob = await new AxiosApiClient(\"\", undefined, undefined, false, {\n\t\t\t\tresponseType: \"blob\",\n\t\t\t}).get(fileToInject.fileUrl);\n\t\t\tconst fileType = await FileHelper.getType(new File([response], fileToInject.rawFile.name));\n\t\t\trawFile = new File([response], fileToInject.rawFile.name, { type: fileType.mime });\n\t\t\tfileToInject.dataURL = await FileHelper.fileToDataUrl(rawFile);\n\t\t}\n\n\t\t// rawFile may not be available because some use cases is not able to return dataURL / fileUrl due to security concerns\n\t\t// in such cases, we will rely on the uploadResponse for file info\n\t\tconst uploadData = fileToInject.uploadResponse?.[\"data\"] || fileToInject.uploadResponse;\n\t\tconst { errorMessage, fileType } = rawFile\n\t\t\t? await readFile({ ...fileToInject, rawFile })\n\t\t\t: validateFileType({\n\t\t\t\t\tmime: uploadData?.[\"mimeType\"],\n\t\t\t\t\text: uploadData?.[\"ext\"],\n\t\t\t });\n\n\t\tlet size = rawFile?.size || uploadData?.[\"fileSize\"] || 0;\n\t\tif (isNaN(size)) {\n\t\t\tsize = 0;\n\t\t}\n\t\tconst { errorMessage: filesizeErrorMessage } = validateFileSize(size);\n\n\t\tconst thumbnailImageDataUrl = rawFile ? await generateThumbnail(fileToInject, fileType?.mime) : undefined;\n\n\t\tsetFilesIfMounted((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...fileToInject,\n\t\t\t\tfileItem: {\n\t\t\t\t\terrorMessage: errorMessage || filesizeErrorMessage,\n\t\t\t\t\tid: fileToInject.fileItem?.id || generateRandomId(),\n\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\tfiles.map(({ fileItem }) => fileItem.name),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\trawFile?.name || fileToInject.rawFile.name\n\t\t\t\t\t),\n\t\t\t\t\tprogress: 1,\n\t\t\t\t\tsize,\n\t\t\t\t\ttype: fileType?.mime || uploadData?.[\"mimeType\"],\n\t\t\t\t\tthumbnailImageDataUrl,\n\t\t\t\t},\n\t\t\t\trawFile,\n\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst parseFile = async (fileToParse: IFile, index: number) => {\n\t\tconst compressedFile = await compressImageFile(fileToParse);\n\t\tconst dataURL = await FileHelper.fileToDataUrl(compressedFile.rawFile);\n\t\tconst { errorMessage, fileType, status } = await readFile({ dataURL, ...compressedFile });\n\n\t\tsetFilesIfMounted((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...compressedFile,\n\t\t\t\tdataURL,\n\t\t\t\tfileItem: {\n\t\t\t\t\terrorMessage,\n\t\t\t\t\tid: generateRandomId(),\n\t\t\t\t\tname: FileHelper.deduplicateFileName(\n\t\t\t\t\t\tfiles.map(({ fileItem }) => fileItem?.name),\n\t\t\t\t\t\tindex,\n\t\t\t\t\t\tFileHelper.sanitizeFileName(compressedFile.rawFile.name)\n\t\t\t\t\t),\n\t\t\t\t\tsize: compressedFile.rawFile.size,\n\t\t\t\t\ttype: fileType.mime,\n\t\t\t\t\tprogress: 0,\n\t\t\t\t},\n\t\t\t\tstatus,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\t};\n\n\tconst uploadFile = async (fileToUpload: IFile, index: number) => {\n\t\tsetFilesIfMounted((prev) => {\n\t\t\tconst updatedFiles = [...prev];\n\t\t\tupdatedFiles[index] = {\n\t\t\t\t...prev[index],\n\t\t\t\tstatus: EFileStatus.UPLOADING,\n\t\t\t};\n\t\t\treturn updatedFiles;\n\t\t});\n\n\t\tconst formData = new FormData();\n\t\tformData.append(\"sessionId\", upload?.sessionId || sessionId.current || \"\");\n\t\tformData.append(\"fileId\", fileToUpload.fileItem.id);\n\t\tformData.append(\"slot\", fileToUpload.slot.toString());\n\t\tif (upload.type === \"base64\") {\n\t\t\tformData.append(\"dataURL\", fileToUpload.dataURL);\n\t\t} else if (upload.type === \"multipart\") {\n\t\t\tformData.append(\"file\", fileToUpload.rawFile, fileToUpload.fileItem?.name);\n\t\t}\n\n\t\ttry {\n\t\t\tconst response = await new AxiosApiClient(\"\", undefined, undefined, true).post(upload.url, formData, {\n\t\t\t\theaders: {\n\t\t\t\t\t\"Content-Type\": upload.type === \"base64\" ? \"application/json\" : \"multipart/form-data\",\n\t\t\t\t\t...upload.headers,\n\t\t\t\t},\n\t\t\t\tonUploadProgress: (progressEvent) => {\n\t\t\t\t\tconst { loaded, total } = progressEvent;\n\t\t\t\t\tsetFilesIfMounted((prev) => {\n\t\t\t\t\t\tif (!prev[index]) return prev;\n\t\t\t\t\t\tconst updatedFiles = [...prev];\n\t\t\t\t\t\tupdatedFiles[index] = {\n\t\t\t\t\t\t\t...prev[index],\n\t\t\t\t\t\t\tfileItem: {\n\t\t\t\t\t\t\t\t...prev[index].fileItem,\n\t\t\t\t\t\t\t\tprogress: Math.min(loaded / total, 0.99),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn updatedFiles;\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t});\n\n\t\t\tconst thumbnailImageDataUrl = await generateThumbnail(fileToUpload);\n\t\t\tsetFilesIfMounted((prev) => {\n\t\t\t\tif (!prev[index]) return prev;\n\t\t\t\tconst updatedFiles = [...prev];\n\t\t\t\tupdatedFiles[index] = {\n\t\t\t\t\t...prev[index],\n\t\t\t\t\tfileItem: {\n\t\t\t\t\t\t...prev[index].fileItem,\n\t\t\t\t\t\tprogress: 0.99,\n\t\t\t\t\t\tthumbnailImageDataUrl,\n\t\t\t\t\t},\n\t\t\t\t\tfileUrl: response?.[\"data\"]?.[\"fileUrl\"],\n\t\t\t\t\tstatus: EFileStatus.UPLOADED,\n\t\t\t\t\tuploadResponse: response,\n\t\t\t\t};\n\t\t\t\treturn updatedFiles;\n\t\t\t});\n\t\t} catch (err) {\n\t\t\tdispatchFieldEvent<TUploadErrorDetail>(\"upload-error\", id, {\n\t\t\t\tfileId: fileToUpload.fileItem.id,\n\t\t\t\terrorData: (err as AxiosError)?.response?.data,\n\t\t\t});\n\n\t\t\tthrow err;\n\t\t}\n\t};\n\n\tconst deleteFile = (index: number) => {\n\t\tsetFilesIfMounted((prev) => prev.filter((_file, i) => i !== index));\n\t};\n\n\tconst compressImageFile = async (fileToCompress: IFile) => {\n\t\tif (maxFileSizeRule.maxSizeInKb > 0 && compressImages) {\n\t\t\tconst maxSizeInB = maxFileSizeRule.maxSizeInKb * 1024;\n\t\t\tif (fileToCompress.rawFile.size > maxSizeInB) {\n\t\t\t\tconst fileType = await FileHelper.getType(fileToCompress.rawFile);\n\t\t\t\tif (RESIZEABLE_IMAGE_TYPES.includes(fileType.mime)) {\n\t\t\t\t\tlet fileOrBlob = await ImageHelper.compressImage(fileToCompress.rawFile, {\n\t\t\t\t\t\tfileSize: maxFileSizeRule.maxSizeInKb,\n\t\t\t\t\t});\n\t\t\t\t\tif (fileOrBlob instanceof Blob) {\n\t\t\t\t\t\tfileOrBlob = FileHelper.blobToFile(fileOrBlob, {\n\t\t\t\t\t\t\tname: fileToCompress.rawFile.name,\n\t\t\t\t\t\t\tlastModified: fileToCompress.rawFile.lastModified,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\t...fileToCompress,\n\t\t\t\t\t\trawFile: fileOrBlob,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\treturn fileToCompress;\n\t};\n\n\t// =============================================================================\n\t// RENDER FUNCTIONS\n\t// =============================================================================\n\treturn null;\n};\n\nexport default FileUploadManager;\n"],"names":["RESIZEABLE_IMAGE_TYPES","props","compressImages","fileTypeRule","fileExtensionRule","hideThumbnail","id","maxFileSizeRule","upload","uploadRule","value","files","setFiles","setCurrentFileIds","useContext","FileUploadContext","previousValue","usePrevious","setValue","useFormContext","dispatchFieldEvent","useFieldEvent","isMounted","useRef","sessionId","setFilesIfMounted","current","isUploadedWithHeldProgress","file","status","EFileStatus","UPLOADED","fileItem","progress","heldProgressFileIds","filter","map","join","useEffect","generateRandomId","forEach","async","index","INJECTED","injectFile","NONE","parseFile","UPLOAD_READY","uploadFile","TO_DELETE","deleteFile","err","handleGenericError","uploadedFiles","hasNotPrefilledFiles","addedFrom","length","gotDeleteFiles","shouldDirty","dataURL","fileUrl","uploadResponse","type","fileId","fileName","name","shouldTouch","prev","undefined","updatedFiles","rawFile","errorMessage","ERROR_MESSAGES","UPLOAD","GENERIC","ERROR_GENERIC","generateThumbnail","fileType","includes","image","ImageHelper","dataUrlToImage","thumbnail","resampleImage","width","height","crop","FileHelper","fileToDataUrl","readFile","fileToRead","getType","fileTypeResult","validateFileType","fileExtension","fileExtensionResult","validateFileExtension","fileSize","getFilesizeFromBase64","size","validateFileSize","ext","FILE_TYPE","ERROR_FORMAT","extensionFromFilename","split","pop","toLowerCase","FILE_EXTENSION","fileSizeInKb","maxSizeInKb","MAX_FILE_SIZE","ERROR_SIZE","fileToInject","INJECTING","blob","dataUrlToBlob","File","response","AxiosApiClient","responseType","get","mime","uploadData","isNaN","filesizeErrorMessage","thumbnailImageDataUrl","deduplicateFileName","fileToParse","compressedFile","compressImageFile","sanitizeFileName","fileToUpload","UPLOADING","formData","FormData","append","slot","toString","post","url","headers","onUploadProgress","progressEvent","loaded","total","Math","min","errorData","data","_file","i","fileToCompress","maxSizeInB","fileOrBlob","compressImage","Blob","blobToFile","lastModified"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("react"),t=require("./index.6a929030.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-icons/exclamation-circle-fill"),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:l,id:u,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",u,e),()=>U("update-image-status",u,e)},[O,u,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(!l){const s=!D("upload-ready",u,{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",u,{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,l=n||i;I(a.map(({id:e})=>e)),S(u,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:l,shouldTouch:n})},[s,u,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),l={w:r.naturalWidth,h:r.naturalHeight};let u;if(i)u=await t.ImageHelper.resampleImage(r,{width:n.width,height:n.height,crop:!0});else{const e=F(l.w,l.h);u=await t.ImageHelper.resampleImage(r,{scale:e})}if(c&&(u=await t.ImageHelper.compressImage(u,{fileSize:c})),c&&u.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(u);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 l;if(i)l=await t.ImageHelper.resampleImage(s,{width:n.width,height:n.height,crop:!0});else{const e=F(r.w,r.h);l=await t.ImageHelper.resampleImage(s,{scale:e})}if(l=await t.ImageHelper.compressImage(l,{fileSize:c}),l.size>1024*c){const a=[...f];a[e]={...f[e],status:t.EImageStatus.ERROR_SIZE},p(a)}else{const a=await t.FileHelper.fileToDataUrl(l),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.d136a8bd.js.map
1
+ "use strict";var e=require("react"),t=require("./index.c2370225.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-icons/exclamation-circle-fill"),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:l,id:u,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",u,e),()=>U("update-image-status",u,e)},[O,u,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(!l){const s=!D("upload-ready",u,{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",u,{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,l=n||i;I(a.map(({id:e})=>e)),S(u,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:l,shouldTouch:n})},[s,u,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),l={w:r.naturalWidth,h:r.naturalHeight};let u;if(i)u=await t.ImageHelper.resampleImage(r,{width:n.width,height:n.height,crop:!0});else{const e=F(l.w,l.h);u=await t.ImageHelper.resampleImage(r,{scale:e})}if(c&&(u=await t.ImageHelper.compressImage(u,{fileSize:c})),c&&u.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(u);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 l;if(i)l=await t.ImageHelper.resampleImage(s,{width:n.width,height:n.height,crop:!0});else{const e=F(r.w,r.h);l=await t.ImageHelper.resampleImage(s,{scale:e})}if(l=await t.ImageHelper.compressImage(l,{fileSize:c}),l.size>1024*c){const a=[...f];a[e]={...f[e],status:t.EImageStatus.ERROR_SIZE},p(a)}else{const a=await t.FileHelper.fileToDataUrl(l),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.48f1a1f1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d136a8bd.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.48f1a1f1.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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"}