@corva/ui 3.74.0-1 → 3.74.0-2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (376) hide show
  1. package/cjs-bundle/components/AddComment/Popover.js +1 -1
  2. package/cjs-bundle/components/AddComment/Popover.js.map +1 -1
  3. package/cjs-bundle/components/AddComment/components/Content.js +1 -1
  4. package/cjs-bundle/components/AddComment/components/Content.js.map +1 -1
  5. package/cjs-bundle/components/AttachmentLightbox/AttachmentDocument.js +2 -0
  6. package/cjs-bundle/components/AttachmentLightbox/AttachmentDocument.js.map +1 -0
  7. package/cjs-bundle/components/AttachmentLightbox/AttachmentLightbox.js +1 -1
  8. package/cjs-bundle/components/AttachmentLightbox/AttachmentLightbox.js.map +1 -1
  9. package/cjs-bundle/components/AttachmentLightbox/AttachmentLightbox.scss.js +1 -1
  10. package/cjs-bundle/components/AttachmentLightbox/AttachmentPreviewPane.js +2 -0
  11. package/cjs-bundle/components/AttachmentLightbox/AttachmentPreviewPane.js.map +1 -0
  12. package/cjs-bundle/components/AttachmentLightbox/copyImageToClipboard.js +2 -0
  13. package/cjs-bundle/components/AttachmentLightbox/copyImageToClipboard.js.map +1 -0
  14. package/cjs-bundle/components/AttachmentLightbox/downloadAttachment.js +2 -0
  15. package/cjs-bundle/components/AttachmentLightbox/downloadAttachment.js.map +1 -0
  16. package/cjs-bundle/components/AttachmentLightbox/useAttachmentLightbox.js +1 -1
  17. package/cjs-bundle/components/AttachmentLightbox/useAttachmentLightbox.js.map +1 -1
  18. package/cjs-bundle/components/AttachmentLightbox/useZoomPan.js +2 -0
  19. package/cjs-bundle/components/AttachmentLightbox/useZoomPan.js.map +1 -0
  20. package/cjs-bundle/components/AttachmentPreview/AttachmentActionsMenu.js +2 -0
  21. package/cjs-bundle/components/AttachmentPreview/AttachmentActionsMenu.js.map +1 -0
  22. package/cjs-bundle/components/AttachmentPreview/AttachmentDownloadLink.js +2 -0
  23. package/cjs-bundle/components/AttachmentPreview/AttachmentDownloadLink.js.map +1 -0
  24. package/cjs-bundle/components/AttachmentPreview/AttachmentImage.js +2 -0
  25. package/cjs-bundle/components/AttachmentPreview/AttachmentImage.js.map +1 -0
  26. package/cjs-bundle/components/AttachmentPreview/AttachmentPreview.js +1 -1
  27. package/cjs-bundle/components/AttachmentPreview/AttachmentPreview.js.map +1 -1
  28. package/cjs-bundle/components/AttachmentPreview/AttachmentPreview.scss.js +1 -1
  29. package/cjs-bundle/components/AttachmentPreview/AttachmentRow.js +1 -1
  30. package/cjs-bundle/components/AttachmentPreview/AttachmentRow.js.map +1 -1
  31. package/cjs-bundle/components/AttachmentPreview/AttachmentTile.js +1 -1
  32. package/cjs-bundle/components/AttachmentPreview/AttachmentTile.js.map +1 -1
  33. package/cjs-bundle/components/AttachmentPreview/useStoredAttachment.js +2 -0
  34. package/cjs-bundle/components/AttachmentPreview/useStoredAttachment.js.map +1 -0
  35. package/cjs-bundle/components/AttachmentPreview/useStoredAttachments.js +1 -1
  36. package/cjs-bundle/components/AttachmentPreview/useStoredAttachments.js.map +1 -1
  37. package/cjs-bundle/components/BICOffsetPickerDialog/index.js +1 -1
  38. package/cjs-bundle/components/BICOffsetPickerDialog/index.js.map +1 -1
  39. package/cjs-bundle/components/Casing/CasingTableV2/components/CasingJoints/Editor.js +1 -1
  40. package/cjs-bundle/components/Casing/CasingTableV2/components/CasingJoints/Editor.js.map +1 -1
  41. package/cjs-bundle/components/Casing/CasingTableV2/components/Component.js +1 -1
  42. package/cjs-bundle/components/Casing/CasingTableV2/components/Component.js.map +1 -1
  43. package/cjs-bundle/components/Casing/CasingTableV2/components/DrillPipe/Editor.js +1 -1
  44. package/cjs-bundle/components/Casing/CasingTableV2/components/DrillPipe/Editor.js.map +1 -1
  45. package/cjs-bundle/components/CommentCard/CommentCard.js +1 -1
  46. package/cjs-bundle/components/CommentCard/CommentCard.js.map +1 -1
  47. package/cjs-bundle/components/CommentCard/CommentMenu.js +1 -1
  48. package/cjs-bundle/components/CommentCard/CommentMenu.js.map +1 -1
  49. package/cjs-bundle/components/CommentComposer/CommentComposer.js +1 -1
  50. package/cjs-bundle/components/CommentComposer/CommentComposer.js.map +1 -1
  51. package/cjs-bundle/components/CommentComposer/CommentReplyInput.js +1 -1
  52. package/cjs-bundle/components/CommentComposer/CommentReplyInput.js.map +1 -1
  53. package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js +1 -1
  54. package/cjs-bundle/components/CommentComposer/useAttachmentUpload.js.map +1 -1
  55. package/cjs-bundle/components/CommentInputNext/CommentInputNext.js +1 -1
  56. package/cjs-bundle/components/CommentInputNext/CommentInputNext.js.map +1 -1
  57. package/cjs-bundle/components/CommentInputNext/useFilePaste.js +2 -0
  58. package/cjs-bundle/components/CommentInputNext/useFilePaste.js.map +1 -0
  59. package/cjs-bundle/components/DocumentViewer/DocumentViewer.js +1 -1
  60. package/cjs-bundle/components/DocumentViewer/DocumentViewer.js.map +1 -1
  61. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Agitator/Editor.js +1 -1
  62. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Agitator/Editor.js.map +1 -1
  63. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Bit/Editor.js +1 -1
  64. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Bit/Editor.js.map +1 -1
  65. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Component.js +1 -1
  66. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Component.js.map +1 -1
  67. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/DrillCollar/Editor.js +1 -1
  68. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/DrillCollar/Editor.js.map +1 -1
  69. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/DrillPipe/Editor.js +1 -1
  70. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/DrillPipe/Editor.js.map +1 -1
  71. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Jar/Editor.js +1 -1
  72. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Jar/Editor.js.map +1 -1
  73. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Lwd/Editor.js +1 -1
  74. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Lwd/Editor.js.map +1 -1
  75. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Mwd/Editor.js +1 -1
  76. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Mwd/Editor.js.map +1 -1
  77. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Pdm/Editor.js +1 -1
  78. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Pdm/Editor.js.map +1 -1
  79. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Rss/Editor.js +1 -1
  80. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Rss/Editor.js.map +1 -1
  81. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Stabilizer/Editor.js +1 -1
  82. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Stabilizer/Editor.js.map +1 -1
  83. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Sub/Editor.js +1 -1
  84. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Sub/Editor.js.map +1 -1
  85. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Ur/Editor.js +1 -1
  86. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/Ur/Editor.js.map +1 -1
  87. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/shared/ConfirmationPopup.js +1 -1
  88. package/cjs-bundle/components/Drillstring/BHAComponentsTable/components/shared/ConfirmationPopup.js.map +1 -1
  89. package/cjs-bundle/components/LinkedText/LinkedText.js +2 -0
  90. package/cjs-bundle/components/LinkedText/LinkedText.js.map +1 -0
  91. package/cjs-bundle/components/LinkedText/LinkedText.scss.js +2 -0
  92. package/cjs-bundle/components/LinkedText/LinkedText.scss.js.map +1 -0
  93. package/cjs-bundle/components/NewDocumentViewer/utils.js +1 -1
  94. package/cjs-bundle/components/NewDocumentViewer/utils.js.map +1 -1
  95. package/cjs-bundle/components/OffsetWellPickerV2/components/Filter/ToggleMapButton.js +1 -1
  96. package/cjs-bundle/components/OffsetWellPickerV2/components/Filter/ToggleMapButton.js.map +1 -1
  97. package/cjs-bundle/components/OffsetWellPickerV2/components/Table/MetricsAddMenu.js +1 -1
  98. package/cjs-bundle/components/OffsetWellPickerV2/components/Table/MetricsAddMenu.js.map +1 -1
  99. package/cjs-bundle/components/OffsetWellPickerV3/components/CustomSelectionView/components/Table/MetricsAddMenu.js +1 -1
  100. package/cjs-bundle/components/OffsetWellPickerV3/components/CustomSelectionView/components/Table/MetricsAddMenu.js.map +1 -1
  101. package/cjs-bundle/components/OffsetWellPickerV3/components/CustomSelectionView/index.js +1 -1
  102. package/cjs-bundle/components/OffsetWellPickerV3/components/CustomSelectionView/index.js.map +1 -1
  103. package/cjs-bundle/components/OffsetWellPickerV3/components/OffsetWellSelectionView/index.js +1 -1
  104. package/cjs-bundle/components/OffsetWellPickerV3/components/OffsetWellSelectionView/index.js.map +1 -1
  105. package/cjs-bundle/components/OffsetWellPickerV3/components/TabSelection/ToggleMapButton.js +1 -1
  106. package/cjs-bundle/components/OffsetWellPickerV3/components/TabSelection/ToggleMapButton.js.map +1 -1
  107. package/cjs-bundle/components/OffsetWellPickerV3/components/TabSelection/index.js +1 -1
  108. package/cjs-bundle/components/OffsetWellPickerV3/components/TabSelection/index.js.map +1 -1
  109. package/cjs-bundle/components/OffsetWellPickerV3/components/WellHubView/index.js +1 -1
  110. package/cjs-bundle/components/OffsetWellPickerV3/components/WellHubView/index.js.map +1 -1
  111. package/cjs-bundle/components/OffsetWellPickerV3/components/shared/OffsetWellTableHead.js +1 -1
  112. package/cjs-bundle/components/OffsetWellPickerV3/components/shared/OffsetWellTableHead.js.map +1 -1
  113. package/cjs-bundle/components/OffsetWellPickerV5/components/Filter/components/CustomDateFields/CustomDateFields.js +1 -1
  114. package/cjs-bundle/components/OffsetWellPickerV5/components/Filter/components/CustomDateFields/CustomDateFields.js.map +1 -1
  115. package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellPickerContent/OffsetWellPickerContent.js +1 -1
  116. package/cjs-bundle/components/OffsetWellPickerV5/components/OffsetWellPickerContent/OffsetWellPickerContent.js.map +1 -1
  117. package/cjs-bundle/components/PadOffsetsPicker/StagesSelector.js +1 -1
  118. package/cjs-bundle/components/PadOffsetsPicker/StagesSelector.js.map +1 -1
  119. package/cjs-bundle/components/PadOffsetsPickerV2/PadOffsetsPickerV2.js +1 -1
  120. package/cjs-bundle/components/PadOffsetsPickerV2/PadOffsetsPickerV2.js.map +1 -1
  121. package/cjs-bundle/components/UserMention/constants.js +1 -1
  122. package/cjs-bundle/components/UserMention/constants.js.map +1 -1
  123. package/cjs-bundle/components/UserMention/index.js +1 -1
  124. package/cjs-bundle/components/UserMention/index.js.map +1 -1
  125. package/cjs-bundle/components/index.js +1 -1
  126. package/cjs-bundle/componentsV2/ButtonIcon/ButtonIcon.js +1 -1
  127. package/cjs-bundle/componentsV2/ButtonIcon/ButtonIcon.js.map +1 -1
  128. package/cjs-bundle/componentsV2/ButtonIcon/ButtonIcon.scss.js +1 -1
  129. package/cjs-bundle/componentsV2/Modal/Modal.js +1 -1
  130. package/cjs-bundle/componentsV2/Modal/Modal.js.map +1 -1
  131. package/cjs-bundle/componentsV2/Modal/constants.js +2 -0
  132. package/cjs-bundle/componentsV2/Modal/constants.js.map +1 -0
  133. package/cjs-bundle/effects/useOutsideClick.js +1 -1
  134. package/cjs-bundle/effects/useOutsideClick.js.map +1 -1
  135. package/cjs-bundle/utils/fetchAttachment.js +2 -0
  136. package/cjs-bundle/utils/fetchAttachment.js.map +1 -0
  137. package/cjs-bundle/utils/links.js +2 -0
  138. package/cjs-bundle/utils/links.js.map +1 -0
  139. package/components/AddComment/Popover.js +1 -1
  140. package/components/AddComment/Popover.js.map +1 -1
  141. package/components/AddComment/components/Content.js +1 -1
  142. package/components/AddComment/components/Content.js.map +1 -1
  143. package/components/AttachmentLightbox/AttachmentDocument.d.ts +6 -0
  144. package/components/AttachmentLightbox/AttachmentDocument.d.ts.map +1 -0
  145. package/components/AttachmentLightbox/AttachmentDocument.js +2 -0
  146. package/components/AttachmentLightbox/AttachmentDocument.js.map +1 -0
  147. package/components/AttachmentLightbox/AttachmentLightbox.d.ts +9 -8
  148. package/components/AttachmentLightbox/AttachmentLightbox.d.ts.map +1 -1
  149. package/components/AttachmentLightbox/AttachmentLightbox.js +1 -1
  150. package/components/AttachmentLightbox/AttachmentLightbox.js.map +1 -1
  151. package/components/AttachmentLightbox/AttachmentLightbox.scss.js +1 -1
  152. package/components/AttachmentLightbox/AttachmentPreviewPane.d.ts +9 -0
  153. package/components/AttachmentLightbox/AttachmentPreviewPane.d.ts.map +1 -0
  154. package/components/AttachmentLightbox/AttachmentPreviewPane.js +2 -0
  155. package/components/AttachmentLightbox/AttachmentPreviewPane.js.map +1 -0
  156. package/components/AttachmentLightbox/__tests__/AttachmentDocument.test.d.ts +2 -0
  157. package/components/AttachmentLightbox/__tests__/AttachmentDocument.test.d.ts.map +1 -0
  158. package/components/AttachmentLightbox/__tests__/AttachmentLightbox.test.d.ts +2 -0
  159. package/components/AttachmentLightbox/__tests__/AttachmentLightbox.test.d.ts.map +1 -0
  160. package/components/AttachmentLightbox/__tests__/copyImageToClipboard.test.d.ts +2 -0
  161. package/components/AttachmentLightbox/__tests__/copyImageToClipboard.test.d.ts.map +1 -0
  162. package/components/AttachmentLightbox/__tests__/downloadAttachment.test.d.ts +2 -0
  163. package/components/AttachmentLightbox/__tests__/downloadAttachment.test.d.ts.map +1 -0
  164. package/components/AttachmentLightbox/__tests__/useZoomPan.test.d.ts +2 -0
  165. package/components/AttachmentLightbox/__tests__/useZoomPan.test.d.ts.map +1 -0
  166. package/components/AttachmentLightbox/copyImageToClipboard.d.ts +4 -0
  167. package/components/AttachmentLightbox/copyImageToClipboard.d.ts.map +1 -0
  168. package/components/AttachmentLightbox/copyImageToClipboard.js +2 -0
  169. package/components/AttachmentLightbox/copyImageToClipboard.js.map +1 -0
  170. package/components/AttachmentLightbox/downloadAttachment.d.ts +10 -0
  171. package/components/AttachmentLightbox/downloadAttachment.d.ts.map +1 -0
  172. package/components/AttachmentLightbox/downloadAttachment.js +2 -0
  173. package/components/AttachmentLightbox/downloadAttachment.js.map +1 -0
  174. package/components/AttachmentLightbox/useAttachmentLightbox.d.ts +6 -2
  175. package/components/AttachmentLightbox/useAttachmentLightbox.d.ts.map +1 -1
  176. package/components/AttachmentLightbox/useAttachmentLightbox.js +1 -1
  177. package/components/AttachmentLightbox/useAttachmentLightbox.js.map +1 -1
  178. package/components/AttachmentLightbox/useZoomPan.d.ts +29 -0
  179. package/components/AttachmentLightbox/useZoomPan.d.ts.map +1 -0
  180. package/components/AttachmentLightbox/useZoomPan.js +2 -0
  181. package/components/AttachmentLightbox/useZoomPan.js.map +1 -0
  182. package/components/AttachmentPreview/AttachmentActionsMenu.d.ts +16 -0
  183. package/components/AttachmentPreview/AttachmentActionsMenu.d.ts.map +1 -0
  184. package/components/AttachmentPreview/AttachmentActionsMenu.js +2 -0
  185. package/components/AttachmentPreview/AttachmentActionsMenu.js.map +1 -0
  186. package/components/AttachmentPreview/AttachmentDownloadLink.d.ts +11 -0
  187. package/components/AttachmentPreview/AttachmentDownloadLink.d.ts.map +1 -0
  188. package/components/AttachmentPreview/AttachmentDownloadLink.js +2 -0
  189. package/components/AttachmentPreview/AttachmentDownloadLink.js.map +1 -0
  190. package/components/AttachmentPreview/AttachmentImage.d.ts +12 -0
  191. package/components/AttachmentPreview/AttachmentImage.d.ts.map +1 -0
  192. package/components/AttachmentPreview/AttachmentImage.js +2 -0
  193. package/components/AttachmentPreview/AttachmentImage.js.map +1 -0
  194. package/components/AttachmentPreview/AttachmentPreview.d.ts.map +1 -1
  195. package/components/AttachmentPreview/AttachmentPreview.js +1 -1
  196. package/components/AttachmentPreview/AttachmentPreview.js.map +1 -1
  197. package/components/AttachmentPreview/AttachmentPreview.scss.js +1 -1
  198. package/components/AttachmentPreview/AttachmentPreview.types.d.ts +7 -0
  199. package/components/AttachmentPreview/AttachmentPreview.types.d.ts.map +1 -1
  200. package/components/AttachmentPreview/AttachmentRow.d.ts +7 -3
  201. package/components/AttachmentPreview/AttachmentRow.d.ts.map +1 -1
  202. package/components/AttachmentPreview/AttachmentRow.js +1 -1
  203. package/components/AttachmentPreview/AttachmentRow.js.map +1 -1
  204. package/components/AttachmentPreview/AttachmentTile.d.ts +5 -1
  205. package/components/AttachmentPreview/AttachmentTile.d.ts.map +1 -1
  206. package/components/AttachmentPreview/AttachmentTile.js +1 -1
  207. package/components/AttachmentPreview/AttachmentTile.js.map +1 -1
  208. package/components/AttachmentPreview/__tests__/AttachmentActionsMenu.test.d.ts +2 -0
  209. package/components/AttachmentPreview/__tests__/AttachmentActionsMenu.test.d.ts.map +1 -0
  210. package/components/AttachmentPreview/__tests__/AttachmentDownloadLink.test.d.ts +2 -0
  211. package/components/AttachmentPreview/__tests__/AttachmentDownloadLink.test.d.ts.map +1 -0
  212. package/components/AttachmentPreview/__tests__/AttachmentImage.test.d.ts +2 -0
  213. package/components/AttachmentPreview/__tests__/AttachmentImage.test.d.ts.map +1 -0
  214. package/components/AttachmentPreview/__tests__/AttachmentTile.test.d.ts +2 -0
  215. package/components/AttachmentPreview/__tests__/AttachmentTile.test.d.ts.map +1 -0
  216. package/components/AttachmentPreview/__tests__/useStoredAttachments.test.d.ts +2 -0
  217. package/components/AttachmentPreview/__tests__/useStoredAttachments.test.d.ts.map +1 -0
  218. package/components/AttachmentPreview/useStoredAttachment.d.ts +8 -0
  219. package/components/AttachmentPreview/useStoredAttachment.d.ts.map +1 -1
  220. package/components/AttachmentPreview/useStoredAttachment.js +2 -0
  221. package/components/AttachmentPreview/useStoredAttachment.js.map +1 -0
  222. package/components/AttachmentPreview/useStoredAttachments.d.ts +1 -1
  223. package/components/AttachmentPreview/useStoredAttachments.d.ts.map +1 -1
  224. package/components/AttachmentPreview/useStoredAttachments.js +1 -1
  225. package/components/AttachmentPreview/useStoredAttachments.js.map +1 -1
  226. package/components/BICOffsetPickerDialog/index.js +1 -1
  227. package/components/BICOffsetPickerDialog/index.js.map +1 -1
  228. package/components/Casing/CasingTableV2/components/CasingJoints/Editor.js +1 -1
  229. package/components/Casing/CasingTableV2/components/CasingJoints/Editor.js.map +1 -1
  230. package/components/Casing/CasingTableV2/components/Component.js +1 -1
  231. package/components/Casing/CasingTableV2/components/Component.js.map +1 -1
  232. package/components/Casing/CasingTableV2/components/DrillPipe/Editor.js +1 -1
  233. package/components/Casing/CasingTableV2/components/DrillPipe/Editor.js.map +1 -1
  234. package/components/CommentCard/CommentCard.d.ts.map +1 -1
  235. package/components/CommentCard/CommentCard.js +1 -1
  236. package/components/CommentCard/CommentCard.js.map +1 -1
  237. package/components/CommentCard/CommentCard.types.d.ts +2 -0
  238. package/components/CommentCard/CommentCard.types.d.ts.map +1 -1
  239. package/components/CommentCard/CommentMenu.d.ts.map +1 -1
  240. package/components/CommentCard/CommentMenu.js +1 -1
  241. package/components/CommentCard/CommentMenu.js.map +1 -1
  242. package/components/CommentComposer/CommentComposer.d.ts.map +1 -1
  243. package/components/CommentComposer/CommentComposer.js +1 -1
  244. package/components/CommentComposer/CommentComposer.js.map +1 -1
  245. package/components/CommentComposer/CommentReplyInput.d.ts.map +1 -1
  246. package/components/CommentComposer/CommentReplyInput.js +1 -1
  247. package/components/CommentComposer/CommentReplyInput.js.map +1 -1
  248. package/components/CommentComposer/__tests__/useAttachmentUpload.linked.test.d.ts +2 -0
  249. package/components/CommentComposer/__tests__/useAttachmentUpload.linked.test.d.ts.map +1 -0
  250. package/components/CommentComposer/useAttachmentUpload.d.ts +1 -0
  251. package/components/CommentComposer/useAttachmentUpload.d.ts.map +1 -1
  252. package/components/CommentComposer/useAttachmentUpload.js +1 -1
  253. package/components/CommentComposer/useAttachmentUpload.js.map +1 -1
  254. package/components/CommentInputNext/CommentInputNext.d.ts +2 -0
  255. package/components/CommentInputNext/CommentInputNext.d.ts.map +1 -1
  256. package/components/CommentInputNext/CommentInputNext.js +1 -1
  257. package/components/CommentInputNext/CommentInputNext.js.map +1 -1
  258. package/components/CommentInputNext/__tests__/useFilePaste.test.d.ts +2 -0
  259. package/components/CommentInputNext/__tests__/useFilePaste.test.d.ts.map +1 -0
  260. package/components/CommentInputNext/useFilePaste.d.ts +17 -0
  261. package/components/CommentInputNext/useFilePaste.d.ts.map +1 -0
  262. package/components/CommentInputNext/useFilePaste.js +2 -0
  263. package/components/CommentInputNext/useFilePaste.js.map +1 -0
  264. package/components/DocumentViewer/DocumentViewer.js +1 -1
  265. package/components/DocumentViewer/DocumentViewer.js.map +1 -1
  266. package/components/Drillstring/BHAComponentsTable/components/Agitator/Editor.js +1 -1
  267. package/components/Drillstring/BHAComponentsTable/components/Agitator/Editor.js.map +1 -1
  268. package/components/Drillstring/BHAComponentsTable/components/Bit/Editor.js +1 -1
  269. package/components/Drillstring/BHAComponentsTable/components/Bit/Editor.js.map +1 -1
  270. package/components/Drillstring/BHAComponentsTable/components/Component.js +1 -1
  271. package/components/Drillstring/BHAComponentsTable/components/Component.js.map +1 -1
  272. package/components/Drillstring/BHAComponentsTable/components/DrillCollar/Editor.js +1 -1
  273. package/components/Drillstring/BHAComponentsTable/components/DrillCollar/Editor.js.map +1 -1
  274. package/components/Drillstring/BHAComponentsTable/components/DrillPipe/Editor.js +1 -1
  275. package/components/Drillstring/BHAComponentsTable/components/DrillPipe/Editor.js.map +1 -1
  276. package/components/Drillstring/BHAComponentsTable/components/Jar/Editor.js +1 -1
  277. package/components/Drillstring/BHAComponentsTable/components/Jar/Editor.js.map +1 -1
  278. package/components/Drillstring/BHAComponentsTable/components/Lwd/Editor.js +1 -1
  279. package/components/Drillstring/BHAComponentsTable/components/Lwd/Editor.js.map +1 -1
  280. package/components/Drillstring/BHAComponentsTable/components/Mwd/Editor.js +1 -1
  281. package/components/Drillstring/BHAComponentsTable/components/Mwd/Editor.js.map +1 -1
  282. package/components/Drillstring/BHAComponentsTable/components/Pdm/Editor.js +1 -1
  283. package/components/Drillstring/BHAComponentsTable/components/Pdm/Editor.js.map +1 -1
  284. package/components/Drillstring/BHAComponentsTable/components/Rss/Editor.js +1 -1
  285. package/components/Drillstring/BHAComponentsTable/components/Rss/Editor.js.map +1 -1
  286. package/components/Drillstring/BHAComponentsTable/components/Stabilizer/Editor.js +1 -1
  287. package/components/Drillstring/BHAComponentsTable/components/Stabilizer/Editor.js.map +1 -1
  288. package/components/Drillstring/BHAComponentsTable/components/Sub/Editor.js +1 -1
  289. package/components/Drillstring/BHAComponentsTable/components/Sub/Editor.js.map +1 -1
  290. package/components/Drillstring/BHAComponentsTable/components/Ur/Editor.js +1 -1
  291. package/components/Drillstring/BHAComponentsTable/components/Ur/Editor.js.map +1 -1
  292. package/components/Drillstring/BHAComponentsTable/components/shared/ConfirmationPopup.js +1 -1
  293. package/components/Drillstring/BHAComponentsTable/components/shared/ConfirmationPopup.js.map +1 -1
  294. package/components/LinkedText/LinkedText.d.ts +17 -0
  295. package/components/LinkedText/LinkedText.d.ts.map +1 -0
  296. package/components/LinkedText/LinkedText.js +2 -0
  297. package/components/LinkedText/LinkedText.js.map +1 -0
  298. package/components/LinkedText/LinkedText.scss.js +2 -0
  299. package/components/LinkedText/LinkedText.scss.js.map +1 -0
  300. package/components/LinkedText/__tests__/LinkedText.test.d.ts +2 -0
  301. package/components/LinkedText/__tests__/LinkedText.test.d.ts.map +1 -0
  302. package/components/LinkedText/index.d.ts +2 -0
  303. package/components/LinkedText/index.d.ts.map +1 -0
  304. package/components/NewDocumentViewer/utils.d.ts.map +1 -1
  305. package/components/NewDocumentViewer/utils.js +1 -1
  306. package/components/NewDocumentViewer/utils.js.map +1 -1
  307. package/components/OffsetWellPickerV2/components/Filter/ToggleMapButton.js +1 -1
  308. package/components/OffsetWellPickerV2/components/Filter/ToggleMapButton.js.map +1 -1
  309. package/components/OffsetWellPickerV2/components/Table/MetricsAddMenu.js +1 -1
  310. package/components/OffsetWellPickerV2/components/Table/MetricsAddMenu.js.map +1 -1
  311. package/components/OffsetWellPickerV3/components/CustomSelectionView/components/Table/MetricsAddMenu.js +1 -1
  312. package/components/OffsetWellPickerV3/components/CustomSelectionView/components/Table/MetricsAddMenu.js.map +1 -1
  313. package/components/OffsetWellPickerV3/components/CustomSelectionView/index.js +1 -1
  314. package/components/OffsetWellPickerV3/components/CustomSelectionView/index.js.map +1 -1
  315. package/components/OffsetWellPickerV3/components/OffsetWellSelectionView/index.js +1 -1
  316. package/components/OffsetWellPickerV3/components/OffsetWellSelectionView/index.js.map +1 -1
  317. package/components/OffsetWellPickerV3/components/TabSelection/ToggleMapButton.js +1 -1
  318. package/components/OffsetWellPickerV3/components/TabSelection/ToggleMapButton.js.map +1 -1
  319. package/components/OffsetWellPickerV3/components/TabSelection/index.js +1 -1
  320. package/components/OffsetWellPickerV3/components/TabSelection/index.js.map +1 -1
  321. package/components/OffsetWellPickerV3/components/WellHubView/index.js +1 -1
  322. package/components/OffsetWellPickerV3/components/WellHubView/index.js.map +1 -1
  323. package/components/OffsetWellPickerV3/components/shared/OffsetWellTableHead.js +1 -1
  324. package/components/OffsetWellPickerV3/components/shared/OffsetWellTableHead.js.map +1 -1
  325. package/components/OffsetWellPickerV5/components/Filter/components/CustomDateFields/CustomDateFields.js +1 -1
  326. package/components/OffsetWellPickerV5/components/Filter/components/CustomDateFields/CustomDateFields.js.map +1 -1
  327. package/components/OffsetWellPickerV5/components/OffsetWellPickerContent/OffsetWellPickerContent.js +1 -1
  328. package/components/OffsetWellPickerV5/components/OffsetWellPickerContent/OffsetWellPickerContent.js.map +1 -1
  329. package/components/PadOffsetsPicker/StagesSelector.js +1 -1
  330. package/components/PadOffsetsPicker/StagesSelector.js.map +1 -1
  331. package/components/PadOffsetsPickerV2/PadOffsetsPickerV2.js +1 -1
  332. package/components/PadOffsetsPickerV2/PadOffsetsPickerV2.js.map +1 -1
  333. package/components/UserMention/__tests__/highlightLinks.test.d.ts +2 -0
  334. package/components/UserMention/__tests__/highlightLinks.test.d.ts.map +1 -0
  335. package/components/UserMention/constants.d.ts +1 -0
  336. package/components/UserMention/constants.d.ts.map +1 -1
  337. package/components/UserMention/constants.js +1 -1
  338. package/components/UserMention/constants.js.map +1 -1
  339. package/components/UserMention/index.js +1 -1
  340. package/components/UserMention/index.js.map +1 -1
  341. package/components/index.d.ts +2 -0
  342. package/components/index.d.ts.map +1 -1
  343. package/components/index.js +1 -1
  344. package/componentsV2/ButtonIcon/ButtonIcon.d.ts +2 -0
  345. package/componentsV2/ButtonIcon/ButtonIcon.d.ts.map +1 -1
  346. package/componentsV2/ButtonIcon/ButtonIcon.js +1 -1
  347. package/componentsV2/ButtonIcon/ButtonIcon.js.map +1 -1
  348. package/componentsV2/ButtonIcon/ButtonIcon.scss.js +1 -1
  349. package/componentsV2/ButtonIcon/ButtonIcon.stories.d.ts +1 -0
  350. package/componentsV2/ButtonIcon/ButtonIcon.stories.d.ts.map +1 -1
  351. package/componentsV2/Modal/Modal.d.ts.map +1 -1
  352. package/componentsV2/Modal/Modal.js +1 -1
  353. package/componentsV2/Modal/Modal.js.map +1 -1
  354. package/componentsV2/Modal/constants.d.ts +3 -0
  355. package/componentsV2/Modal/constants.d.ts.map +1 -0
  356. package/componentsV2/Modal/constants.js +2 -0
  357. package/componentsV2/Modal/constants.js.map +1 -0
  358. package/effects/__tests__/useOutsideClick.test.d.ts.map +1 -1
  359. package/effects/useOutsideClick.d.ts.map +1 -1
  360. package/effects/useOutsideClick.js +1 -1
  361. package/effects/useOutsideClick.js.map +1 -1
  362. package/mcp-server/server.mjs +35 -9
  363. package/package.json +1 -1
  364. package/tsconfig.tsbuildinfo +1 -1
  365. package/utils/__tests__/fetchAttachment.test.d.ts +2 -0
  366. package/utils/__tests__/fetchAttachment.test.d.ts.map +1 -0
  367. package/utils/__tests__/links.test.d.ts +2 -0
  368. package/utils/__tests__/links.test.d.ts.map +1 -0
  369. package/utils/fetchAttachment.d.ts +3 -0
  370. package/utils/fetchAttachment.d.ts.map +1 -0
  371. package/utils/fetchAttachment.js +2 -0
  372. package/utils/fetchAttachment.js.map +1 -0
  373. package/utils/links.d.ts +14 -0
  374. package/utils/links.d.ts.map +1 -0
  375. package/utils/links.js +2 -0
  376. package/utils/links.js.map +1 -0
@@ -1,2 +1,2 @@
1
- import o from"@babel/runtime/helpers/defineProperty";import{useMemo as s,useCallback as n,useRef as t}from"react";import{Input as i}from"@material-ui/core";import c from"@material-ui/icons/AlternateEmail";import{ButtonIcon as e}from"../../componentsV2/ButtonIcon/ButtonIcon.js";import{Tooltip as r}from"../../componentsV2/Tooltip/Tooltip.js";import{SmilingFaceIcon as m}from"../../icons/iconParkIcons.js";import"../../icons/customIcons/icons/AddMessage.js";import"../../icons/customIcons/icons/DragOne.js";import"../../icons/customIcons/icons/Attention.js";import"../../icons/customIcons/icons/Collapse.js";import"../../icons/customIcons/icons/Dashboard.js";import"../../icons/customIcons/icons/Expand.js";import"../../icons/customIcons/icons/FolderClosed.js";import"../../icons/customIcons/icons/FolderClosedFilled.js";import"../../icons/customIcons/icons/FolderOpened.js";import"../../icons/customIcons/icons/GreaterOrEqual.js";import"../../icons/customIcons/icons/LessOrEqual.js";import"../../icons/customIcons/icons/Search.js";import"../../icons/customIcons/icons/SearchOne.js";import"../../icons/customIcons/icons/Wellhub.js";import"../../icons/customIcons/icons/MultiRuler.js";import"../../icons/customIcons/icons/Checkbox.js";import"../../icons/customIcons/icons/CheckboxChecked.js";import"../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../icons/customIcons/icons/Radio.js";import"../../icons/customIcons/icons/RadioChecked.js";import"../../icons/customIcons/icons/SimulFrac.js";import"../../icons/customIcons/icons/ZipperFrac.js";import"../../icons/customIcons/icons/CautionFilled.js";import"../../icons/customIcons/icons/MoreApp.js";import"../../icons/customIcons/icons/Pad.js";import"../../icons/customIcons/icons/DrilloutUnit.js";import"../../icons/customIcons/icons/FracFleet.js";import"../../icons/customIcons/icons/Global.js";import"../../icons/customIcons/icons/Program.js";import"../../icons/customIcons/icons/Rig.js";import"../../icons/customIcons/icons/Well.js";import"../../icons/customIcons/icons/Gap.js";import"../../icons/customIcons/icons/Pin.js";import"../../icons/customIcons/icons/CloseOneFilled.js";import"../../icons/customIcons/icons/AttentionFilled.js";import"../../icons/customIcons/icons/CheckOneFilled.js";import"../../icons/customIcons/icons/Archive.js";import"../../icons/customIcons/icons/ArchiveCancel.js";import"../../icons/customIcons/icons/Unarchive.js";import"../../icons/customIcons/icons/Archived.js";import"../../icons/customIcons/icons/InterventionUnit.js";import"../../icons/customIcons/icons/CloudDelete.js";import"../../icons/customIcons/icons/Lasso.js";import"../../icons/customIcons/icons/Radius.js";import"../../icons/customIcons/icons/ErrorOps.js";import"../../icons/customIcons/icons/DataTypeOps.js";import"../../icons/customIcons/icons/FalsePositiveOps.js";import"../../icons/customIcons/icons/CalibrationOps.js";import"../../icons/customIcons/icons/CriticalOps.js";import"../../icons/customIcons/icons/Company.js";import"../../icons/customIcons/icons/ArchiveOne.js";import"../../icons/customIcons/icons/ParseBotFusion.js";import"../../icons/customIcons/icons/Connect.js";import"../../icons/customIcons/icons/PuzzleOne.js";import"../../icons/customIcons/icons/Feed.js";import"../../icons/customIcons/icons/Prompt.js";import"../../icons/customIcons/icons/Companies.js";import"../../icons/customIcons/icons/ClipboardAi.js";import"../../icons/customIcons/icons/Key.js";import"../../icons/customIcons/icons/AtSignCrossed.js";import"../../icons/customIcons/icons/MappingManual.js";import"../../icons/customIcons/icons/Mapping.js";import"../../icons/customIcons/icons/Metrics.js";import"../../icons/customIcons/icons/Drops.js";import"../../icons/customIcons/icons/ClipboardSearch.js";import"../../icons/customIcons/icons/Template.js";import"../../icons/customIcons/icons/ClipboardMetrics.js";import"../../icons/customIcons/icons/ClipboardBuilder.js";import"../../icons/customIcons/icons/UnitConversion.js";import"../../icons/customIcons/icons/NPT.js";import"../../icons/customIcons/icons/GuidedFrac.js";import{AvatarComponent as a}from"../Avatar/index.js";import{AttachFileButton as l}from"../AttachFileButton/AttachFileButton.js";import{CommentInput as p}from"../CommentInputNext/CommentInputNext.js";import u from"../EmojiIconButton.js";import d from"../FailedFileUploading.js";import j from"../UserMention/index.js";import{isSuggestionsListOpened as I}from"../UserMention/utils/index.js";import{useAttachmentUpload as h,DEFAULT_MAX_ATTACHMENTS as f}from"./useAttachmentUpload.js";import{CommentMetaLine as b}from"./CommentMetaLine.js";import{ShareToChatRow as g}from"./ShareToChatRow.js";import v from"./CommentComposer.scss.js";import{jsx as C,jsxs as y,Fragment as O}from"react/jsx-runtime";function F(o,s){var n=Object.keys(o);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(o);s&&(t=t.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),n.push.apply(n,t)}return n}function A(s){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?F(Object(t),!0).forEach((function(n){o(s,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(t)):F(Object(t)).forEach((function(o){Object.defineProperty(s,o,Object.getOwnPropertyDescriptor(t,o))}))}return s}var S={fontSize:14,lineHeight:"20px",suggestions:{backgroundColor:"var(--palette-background-b-9)",list:{backgroundColor:"var(--palette-background-b-9)"},item:{color:"var(--palette-primary-text-1)","&focused":{backgroundColor:"rgb(from var(--palette-primary-text-1) r g b / 0.08)"}}}},P=function(o){return y("div",{className:v.suggestion,children:[C(a,{size:26,alt:o.display,imgSrc:o.photo,displayName:o.display}),C("span",{children:o.display})]})},x=function(o){var a=o.body,F=o.onBodyChange,x=o.onSubmit,E=o.canSubmit,k=o.currentUser,D=o.attachments,w=o.onAttachmentsChange,R=o.maxAttachments,M=void 0===R?f:R,U=o.attachment,B=o.onAttachmentChange,z=o.attachmentError,N=o.onAttachmentError,T=o.maxAttachmentSizeBytes,L=o.disabled,G=o.autoFocus,q=o.placeholder,K=void 0===q?"Add a comment...":q,W=o.metaRows,H=o.isMetaSingleLine,V=o.shareToChat,Q=o.trailing,Z=o.embedded,$=o.className,J=o.testId,X=!!w,Y=s((function(){return X?null!=D?D:[]:[U].filter(Boolean)}),[X,D,U]),_=n((function(o){var s;w?w(o):null==B||B(null!==(s=o[0])&&void 0!==s?s:null)}),[w,B]),oo=h({value:Y,onChange:_,onError:N,maxSizeBytes:T,maxFiles:X?M:1}),so=E&&!oo.isUploading,no=t(null);return C(p,{value:a,canSubmit:so,disabled:L,onSubmit:x,trailing:Q,embedded:Z,className:$,testId:J,field:C(i,{inputComponent:j,inputProps:{onChange:F,currentUser:k,allowEmptyQuery:!0,suggestionsPortalHost:document.querySelector("body"),withLightTheme:!1,mentionProps:{renderSuggestion:P},style:S},value:a,placeholder:K,inputRef:no,className:v.mentionField,onKeyDown:function(o){"Enter"!==o.key||o.shiftKey||so&&!L&&(I()||(o.preventDefault(),x()))},disableUnderline:!0,rows:1,fullWidth:!0,multiline:!0,autoFocus:G}),attachments:oo.items,onAttachmentRemove:oo.removeAttachment,onAttachmentRetry:oo.handleRetry,onAttachmentReorder:X?oo.reorderAttachments:void 0,onFilesDrop:oo.addFiles,dropLabel:1===oo.maxFiles?"Drop a file here":"Drop files here",attachmentSlot:z?C(d,{errorMessage:z}):void 0,toolbar:y(O,{children:[C(l,{inputRef:oo.fileInputRef,onClick:oo.openFileDialog,onFileSelect:oo.handleFileSelect,multiple:X,disabled:oo.isFull,tooltip:oo.isFull?"Up to ".concat(oo.maxFiles," ").concat(1===oo.maxFiles?"file":"files"," can be attached"):"Attach file"}),C(r,{title:"Mention someone",children:C(e,{size:"xs",type:"tertiary",onClick:function(){var o,s=no.current;if(s){s.focus();var n=!!s.value&&!/\s$/.test(s.value),t="".concat(s.value).concat(n?" @":"@"),i=null===(o=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(s),"value"))||void 0===o?void 0:o.set;null==i||i.call(s,t),s.setSelectionRange(t.length,t.length),s.dispatchEvent(new Event("input",{bubbles:!0})),s.dispatchEvent(new Event("keyup",{bubbles:!0}))}},children:C(c,{fontSize:"inherit"})})}),C("span",{className:v.iconSlot,children:C(u,{icon:C(m,{size:16}),handleSelectEmoji:function(o){return F("".concat(a).concat(o.native))}})})]}),footer:(!(null==W||!W.length)||!!V)&&y(O,{children:[C(b,{rows:null!=W?W:[],singleLine:H}),V&&C(g,A({},V))]})})};export{x as CommentComposer};
1
+ import o from"@babel/runtime/helpers/defineProperty";import{useMemo as s,useCallback as n,useRef as t}from"react";import{Input as i}from"@material-ui/core";import c from"@material-ui/icons/AlternateEmail";import{ButtonIcon as e}from"../../componentsV2/ButtonIcon/ButtonIcon.js";import{Tooltip as r}from"../../componentsV2/Tooltip/Tooltip.js";import{SmilingFaceIcon as m}from"../../icons/iconParkIcons.js";import"../../icons/customIcons/icons/AddMessage.js";import"../../icons/customIcons/icons/DragOne.js";import"../../icons/customIcons/icons/Attention.js";import"../../icons/customIcons/icons/Collapse.js";import"../../icons/customIcons/icons/Dashboard.js";import"../../icons/customIcons/icons/Expand.js";import"../../icons/customIcons/icons/FolderClosed.js";import"../../icons/customIcons/icons/FolderClosedFilled.js";import"../../icons/customIcons/icons/FolderOpened.js";import"../../icons/customIcons/icons/GreaterOrEqual.js";import"../../icons/customIcons/icons/LessOrEqual.js";import"../../icons/customIcons/icons/Search.js";import"../../icons/customIcons/icons/SearchOne.js";import"../../icons/customIcons/icons/Wellhub.js";import"../../icons/customIcons/icons/MultiRuler.js";import"../../icons/customIcons/icons/Checkbox.js";import"../../icons/customIcons/icons/CheckboxChecked.js";import"../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../icons/customIcons/icons/Radio.js";import"../../icons/customIcons/icons/RadioChecked.js";import"../../icons/customIcons/icons/SimulFrac.js";import"../../icons/customIcons/icons/ZipperFrac.js";import"../../icons/customIcons/icons/CautionFilled.js";import"../../icons/customIcons/icons/MoreApp.js";import"../../icons/customIcons/icons/Pad.js";import"../../icons/customIcons/icons/DrilloutUnit.js";import"../../icons/customIcons/icons/FracFleet.js";import"../../icons/customIcons/icons/Global.js";import"../../icons/customIcons/icons/Program.js";import"../../icons/customIcons/icons/Rig.js";import"../../icons/customIcons/icons/Well.js";import"../../icons/customIcons/icons/Gap.js";import"../../icons/customIcons/icons/Pin.js";import"../../icons/customIcons/icons/CloseOneFilled.js";import"../../icons/customIcons/icons/AttentionFilled.js";import"../../icons/customIcons/icons/CheckOneFilled.js";import"../../icons/customIcons/icons/Archive.js";import"../../icons/customIcons/icons/ArchiveCancel.js";import"../../icons/customIcons/icons/Unarchive.js";import"../../icons/customIcons/icons/Archived.js";import"../../icons/customIcons/icons/InterventionUnit.js";import"../../icons/customIcons/icons/CloudDelete.js";import"../../icons/customIcons/icons/Lasso.js";import"../../icons/customIcons/icons/Radius.js";import"../../icons/customIcons/icons/ErrorOps.js";import"../../icons/customIcons/icons/DataTypeOps.js";import"../../icons/customIcons/icons/FalsePositiveOps.js";import"../../icons/customIcons/icons/CalibrationOps.js";import"../../icons/customIcons/icons/CriticalOps.js";import"../../icons/customIcons/icons/Company.js";import"../../icons/customIcons/icons/ArchiveOne.js";import"../../icons/customIcons/icons/ParseBotFusion.js";import"../../icons/customIcons/icons/Connect.js";import"../../icons/customIcons/icons/PuzzleOne.js";import"../../icons/customIcons/icons/Feed.js";import"../../icons/customIcons/icons/Prompt.js";import"../../icons/customIcons/icons/Companies.js";import"../../icons/customIcons/icons/ClipboardAi.js";import"../../icons/customIcons/icons/Key.js";import"../../icons/customIcons/icons/AtSignCrossed.js";import"../../icons/customIcons/icons/MappingManual.js";import"../../icons/customIcons/icons/Mapping.js";import"../../icons/customIcons/icons/Metrics.js";import"../../icons/customIcons/icons/Drops.js";import"../../icons/customIcons/icons/ClipboardSearch.js";import"../../icons/customIcons/icons/Template.js";import"../../icons/customIcons/icons/ClipboardMetrics.js";import"../../icons/customIcons/icons/ClipboardBuilder.js";import"../../icons/customIcons/icons/UnitConversion.js";import"../../icons/customIcons/icons/NPT.js";import"../../icons/customIcons/icons/GuidedFrac.js";import{AvatarComponent as a}from"../Avatar/index.js";import{AttachFileButton as l}from"../AttachFileButton/AttachFileButton.js";import{CommentInput as p}from"../CommentInputNext/CommentInputNext.js";import u from"../EmojiIconButton.js";import d from"../FailedFileUploading.js";import j from"../UserMention/index.js";import{isSuggestionsListOpened as I}from"../UserMention/utils/index.js";import{useAttachmentUpload as h,DEFAULT_MAX_ATTACHMENTS as f}from"./useAttachmentUpload.js";import{CommentMetaLine as b}from"./CommentMetaLine.js";import{ShareToChatRow as g}from"./ShareToChatRow.js";import v from"./CommentComposer.scss.js";import{jsx as C,jsxs as y,Fragment as O}from"react/jsx-runtime";function F(o,s){var n=Object.keys(o);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(o);s&&(t=t.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),n.push.apply(n,t)}return n}function A(s){for(var n=1;n<arguments.length;n++){var t=null!=arguments[n]?arguments[n]:{};n%2?F(Object(t),!0).forEach((function(n){o(s,n,t[n])})):Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(t)):F(Object(t)).forEach((function(o){Object.defineProperty(s,o,Object.getOwnPropertyDescriptor(t,o))}))}return s}var S={fontSize:14,lineHeight:"20px",suggestions:{backgroundColor:"var(--palette-background-b-9)",list:{backgroundColor:"var(--palette-background-b-9)"},item:{color:"var(--palette-primary-text-1)","&focused":{backgroundColor:"rgb(from var(--palette-primary-text-1) r g b / 0.08)"}}}},P=function(o){return y("div",{className:v.suggestion,children:[C(a,{size:26,alt:o.display,imgSrc:o.photo,displayName:o.display}),C("span",{children:o.display})]})},x=function(o){var a=o.body,F=o.onBodyChange,x=o.onSubmit,k=o.canSubmit,E=o.currentUser,D=o.attachments,w=o.onAttachmentsChange,R=o.maxAttachments,M=void 0===R?f:R,U=o.attachment,B=o.onAttachmentChange,L=o.attachmentError,z=o.onAttachmentError,N=o.maxAttachmentSizeBytes,T=o.disabled,G=o.autoFocus,q=o.placeholder,K=void 0===q?"Add a comment...":q,W=o.metaRows,H=o.isMetaSingleLine,V=o.shareToChat,Q=o.trailing,Z=o.embedded,$=o.className,J=o.testId,X=!!w,Y=s((function(){return X?null!=D?D:[]:[U].filter(Boolean)}),[X,D,U]),_=n((function(o){var s;w?w(o):null==B||B(null!==(s=o[0])&&void 0!==s?s:null)}),[w,B]),oo=h({value:Y,onChange:_,onError:z,maxSizeBytes:N,maxFiles:X?M:1}),so=k&&!oo.isUploading,no=t(null);return C(p,{value:a,canSubmit:so,disabled:T,onSubmit:x,trailing:Q,embedded:Z,className:$,testId:J,field:C(i,{inputComponent:j,inputProps:{onChange:F,currentUser:E,allowEmptyQuery:!0,suggestionsPortalHost:document.querySelector("body"),withLightTheme:!1,mentionProps:{renderSuggestion:P},highlightLinks:!0,style:S},value:a,placeholder:K,inputRef:no,className:v.mentionField,onKeyDown:function(o){"Enter"!==o.key||o.shiftKey||so&&!T&&(I()||(o.preventDefault(),x()))},disableUnderline:!0,rows:1,fullWidth:!0,multiline:!0,autoFocus:G}),attachments:oo.items,onAttachmentRemove:oo.removeAttachment,onAttachmentRetry:oo.handleRetry,onAttachmentReorder:X?oo.reorderAttachments:void 0,onFilesDrop:oo.addFiles,onImageLinkPaste:oo.addLinkedImage,dropLabel:1===oo.maxFiles?"Drop a file here":"Drop files here",attachmentSlot:L?C(d,{errorMessage:L}):void 0,toolbar:y(O,{children:[C(l,{inputRef:oo.fileInputRef,onClick:oo.openFileDialog,onFileSelect:oo.handleFileSelect,multiple:X,disabled:oo.isFull,tooltip:oo.isFull?"Up to ".concat(oo.maxFiles," ").concat(1===oo.maxFiles?"file":"files"," can be attached"):"Attach file"}),C(r,{title:"Mention someone",children:C(e,{size:"xs",type:"tertiary",onClick:function(){var o,s=no.current;if(s){s.focus();var n=!!s.value&&!/\s$/.test(s.value),t="".concat(s.value).concat(n?" @":"@"),i=null===(o=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(s),"value"))||void 0===o?void 0:o.set;null==i||i.call(s,t),s.setSelectionRange(t.length,t.length),s.dispatchEvent(new Event("input",{bubbles:!0})),s.dispatchEvent(new Event("keyup",{bubbles:!0}))}},children:C(c,{fontSize:"inherit"})})}),C("span",{className:v.iconSlot,children:C(u,{icon:C(m,{size:16}),handleSelectEmoji:function(o){return F("".concat(a).concat(o.native))}})})]}),footer:(!(null==W||!W.length)||!!V)&&y(O,{children:[C(b,{rows:null!=W?W:[],singleLine:H}),V&&C(g,A({},V))]})})};export{x as CommentComposer};
2
2
  //# sourceMappingURL=CommentComposer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentComposer.js","sources":["../../../src/components/CommentComposer/CommentComposer.tsx"],"sourcesContent":["import {\n CSSProperties,\n FormEventHandler,\n KeyboardEvent,\n ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport { Input } from '@material-ui/core';\nimport AlternateEmailIcon from '@material-ui/icons/AlternateEmail';\n\nimport { ButtonIcon } from '../../componentsV2/ButtonIcon';\nimport { Tooltip } from '../../componentsV2/Tooltip';\nimport { SmilingFaceIcon } from '../../icons';\nimport Avatar from '../Avatar';\nimport { AttachFileButton } from '../AttachFileButton';\nimport { CommentInput } from '../CommentInputNext/CommentInputNext';\nimport EmojiIconButton from '../EmojiIconButton';\nimport FailedFileUploading from '../FailedFileUploading';\nimport UserMention from '../UserMention';\nimport { isSuggestionsListOpened } from '../UserMention/utils';\n\nimport {\n useAttachmentUpload,\n UploadedAttachment,\n DEFAULT_MAX_ATTACHMENTS,\n} from './useAttachmentUpload';\nimport { CommentMetaLine, CommentMetaRow } from './CommentMetaLine';\nimport { ShareToChatRow, ShareToChatRowProps } from './ShareToChatRow';\n\nimport styles from './CommentComposer.scss';\n\n/* eslint-disable camelcase -- mirrors the platform's snake_case user payload. */\nexport type CommentComposerUser = {\n id?: number;\n company_id?: number;\n first_name?: string;\n last_name?: string;\n profile_photo?: string;\n [key: string]: unknown;\n};\n/* eslint-enable camelcase */\n\nexport type CommentComposerProps = {\n body: string;\n onBodyChange: (value: string) => void;\n onSubmit: () => void;\n canSubmit: boolean;\n currentUser: CommentComposerUser;\n\n attachments?: UploadedAttachment[];\n onAttachmentsChange?: (attachments: UploadedAttachment[]) => void;\n maxAttachments?: number;\n /** @deprecated Use `attachments` — kept so single-attachment callers keep working. */\n attachment?: UploadedAttachment | null;\n /** @deprecated Use `onAttachmentsChange`. */\n onAttachmentChange?: (attachment: UploadedAttachment | null) => void;\n attachmentError?: string | null;\n onAttachmentError?: (message: string | null) => void;\n maxAttachmentSizeBytes?: number;\n\n disabled?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n metaRows?: CommentMetaRow[];\n isMetaSingleLine?: boolean;\n shareToChat?: Omit<ShareToChatRowProps, 'testId'>;\n /** Replaces the default send button, e.g. the edit form's Cancel/Save. */\n trailing?: ReactNode;\n /** Render flush inside a host card instead of as its own surface. */\n embedded?: boolean;\n className?: string;\n testId?: string;\n};\n\nconst SUGGESTIONS_BACKGROUND = 'var(--palette-background-b-9)';\n\n// Module-level so react-mentions isn't re-rendered on every keystroke.\nconst MENTION_INPUT_STYLE = {\n fontSize: 14,\n lineHeight: '20px',\n suggestions: {\n backgroundColor: SUGGESTIONS_BACKGROUND,\n list: { backgroundColor: SUGGESTIONS_BACKGROUND },\n item: {\n color: 'var(--palette-primary-text-1)',\n '&focused': { backgroundColor: 'rgb(from var(--palette-primary-text-1) r g b / 0.08)' },\n },\n },\n} as unknown as CSSProperties;\n\nconst renderSuggestion = (entry: { display: string; photo?: string }) => (\n <div className={styles.suggestion}>\n <Avatar size={26} alt={entry.display} imgSrc={entry.photo} displayName={entry.display} />\n <span>{entry.display}</span>\n </div>\n);\n\nexport const CommentComposer = ({\n body,\n onBodyChange,\n onSubmit,\n canSubmit,\n currentUser,\n attachments,\n onAttachmentsChange,\n maxAttachments = DEFAULT_MAX_ATTACHMENTS,\n attachment,\n onAttachmentChange,\n attachmentError,\n onAttachmentError,\n maxAttachmentSizeBytes,\n disabled,\n autoFocus,\n placeholder = 'Add a comment...',\n metaRows,\n isMetaSingleLine,\n shareToChat,\n trailing,\n embedded,\n className,\n testId,\n}: CommentComposerProps) => {\n // Callers still on the singular props get the old one-file behaviour, unchanged.\n const isMulti = !!onAttachmentsChange;\n const value = useMemo(\n () => (isMulti ? attachments ?? [] : ([attachment].filter(Boolean) as UploadedAttachment[])),\n [isMulti, attachments, attachment]\n );\n\n const handleAttachmentsChange = useCallback(\n (next: UploadedAttachment[]) => {\n if (onAttachmentsChange) onAttachmentsChange(next);\n else onAttachmentChange?.(next[0] ?? null);\n },\n [onAttachmentsChange, onAttachmentChange]\n );\n\n const upload = useAttachmentUpload({\n value,\n onChange: handleAttachmentsChange,\n onError: onAttachmentError,\n maxSizeBytes: maxAttachmentSizeBytes,\n maxFiles: isMulti ? maxAttachments : 1,\n });\n\n // An attachment only lands once S3 confirms, so posting mid-upload would drop it.\n const canSend = canSubmit && !upload.isUploading;\n\n const fieldRef = useRef<HTMLTextAreaElement | null>(null);\n\n // react-mentions opens suggestions from textarea events, so type \"@\" instead of setting state.\n const mentionSomeone = () => {\n const field = fieldRef.current;\n if (!field) return;\n\n field.focus();\n\n const needsSpace = !!field.value && !/\\s$/.test(field.value);\n const nextValue = `${field.value}${needsSpace ? ' @' : '@'}`;\n const setValue = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(field), 'value')?.set;\n\n setValue?.call(field, nextValue);\n field.setSelectionRange(nextValue.length, nextValue.length);\n field.dispatchEvent(new Event('input', { bubbles: true }));\n field.dispatchEvent(new Event('keyup', { bubbles: true }));\n };\n\n const handleEnterKey = (event: KeyboardEvent) => {\n if (event.key !== 'Enter' || event.shiftKey) return;\n if (!canSend || disabled) return;\n if (isSuggestionsListOpened()) return;\n\n event.preventDefault();\n onSubmit();\n };\n\n return (\n <CommentInput\n value={body}\n canSubmit={canSend}\n disabled={disabled}\n onSubmit={onSubmit}\n trailing={trailing}\n embedded={embedded}\n className={className}\n testId={testId}\n field={\n <Input\n inputComponent={UserMention}\n inputProps={{\n // UserMention calls onChange with the text string, not a DOM event.\n onChange: onBodyChange as unknown as FormEventHandler<HTMLInputElement>,\n currentUser,\n allowEmptyQuery: true,\n suggestionsPortalHost: document.querySelector('body'),\n withLightTheme: false,\n mentionProps: { renderSuggestion },\n style: MENTION_INPUT_STYLE,\n }}\n value={body}\n placeholder={placeholder}\n inputRef={fieldRef}\n className={styles.mentionField}\n onKeyDown={handleEnterKey}\n disableUnderline\n rows={1}\n fullWidth\n multiline\n autoFocus={autoFocus}\n />\n }\n attachments={upload.items}\n onAttachmentRemove={upload.removeAttachment}\n onAttachmentRetry={upload.handleRetry}\n onAttachmentReorder={isMulti ? upload.reorderAttachments : undefined}\n onFilesDrop={upload.addFiles}\n dropLabel={upload.maxFiles === 1 ? 'Drop a file here' : 'Drop files here'}\n attachmentSlot={\n attachmentError ? <FailedFileUploading errorMessage={attachmentError} /> : undefined\n }\n toolbar={\n <>\n <AttachFileButton\n inputRef={upload.fileInputRef}\n onClick={upload.openFileDialog}\n onFileSelect={upload.handleFileSelect}\n multiple={isMulti}\n disabled={upload.isFull}\n tooltip={\n upload.isFull\n ? `Up to ${upload.maxFiles} ${\n upload.maxFiles === 1 ? 'file' : 'files'\n } can be attached`\n : 'Attach file'\n }\n />\n <Tooltip title=\"Mention someone\">\n <ButtonIcon size=\"xs\" type=\"tertiary\" onClick={mentionSomeone}>\n <AlternateEmailIcon fontSize=\"inherit\" />\n </ButtonIcon>\n </Tooltip>\n <span className={styles.iconSlot}>\n <EmojiIconButton\n icon={<SmilingFaceIcon size={16} />}\n handleSelectEmoji={(emoji: { native: string }) =>\n onBodyChange(`${body}${emoji.native}`)\n }\n />\n </span>\n </>\n }\n footer={\n (!!metaRows?.length || !!shareToChat) && (\n <>\n <CommentMetaLine rows={metaRows ?? []} singleLine={isMetaSingleLine} />\n {shareToChat && <ShareToChatRow {...shareToChat} />}\n </>\n )\n }\n />\n );\n};\n"],"names":["MENTION_INPUT_STYLE","fontSize","lineHeight","suggestions","backgroundColor","list","item","color","renderSuggestion","entry","_jsxs","className","styles","suggestion","children","_jsx","Avatar","size","alt","display","imgSrc","photo","displayName","CommentComposer","_ref","body","onBodyChange","onSubmit","canSubmit","currentUser","attachments","onAttachmentsChange","_ref$maxAttachments","maxAttachments","DEFAULT_MAX_ATTACHMENTS","attachment","onAttachmentChange","attachmentError","onAttachmentError","maxAttachmentSizeBytes","disabled","autoFocus","_ref$placeholder","placeholder","metaRows","isMetaSingleLine","shareToChat","trailing","embedded","testId","isMulti","value","useMemo","filter","Boolean","handleAttachmentsChange","useCallback","next","_next$","upload","useAttachmentUpload","onChange","onError","maxSizeBytes","maxFiles","canSend","isUploading","fieldRef","useRef","CommentInput","field","Input","inputComponent","UserMention","inputProps","allowEmptyQuery","suggestionsPortalHost","document","querySelector","withLightTheme","mentionProps","style","inputRef","mentionField","onKeyDown","event","key","shiftKey","isSuggestionsListOpened","preventDefault","disableUnderline","rows","fullWidth","multiline","items","onAttachmentRemove","removeAttachment","onAttachmentRetry","handleRetry","onAttachmentReorder","reorderAttachments","undefined","onFilesDrop","addFiles","dropLabel","attachmentSlot","FailedFileUploading","errorMessage","toolbar","_Fragment","AttachFileButton","fileInputRef","onClick","openFileDialog","onFileSelect","handleFileSelect","multiple","isFull","tooltip","concat","Tooltip","title","ButtonIcon","type","_Object$getOwnPropert","current","focus","needsSpace","test","nextValue","setValue","Object","getOwnPropertyDescriptor","getPrototypeOf","set","call","setSelectionRange","length","dispatchEvent","Event","bubbles","AlternateEmailIcon","iconSlot","EmojiIconButton","icon","SmilingFaceIcon","handleSelectEmoji","emoji","native","footer","CommentMetaLine","singleLine","ShareToChatRow","_objectSpread"],"mappings":"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"}
1
+ {"version":3,"file":"CommentComposer.js","sources":["../../../src/components/CommentComposer/CommentComposer.tsx"],"sourcesContent":["import {\n CSSProperties,\n FormEventHandler,\n KeyboardEvent,\n ReactNode,\n useCallback,\n useMemo,\n useRef,\n} from 'react';\nimport { Input } from '@material-ui/core';\nimport AlternateEmailIcon from '@material-ui/icons/AlternateEmail';\n\nimport { ButtonIcon } from '../../componentsV2/ButtonIcon';\nimport { Tooltip } from '../../componentsV2/Tooltip';\nimport { SmilingFaceIcon } from '../../icons';\nimport Avatar from '../Avatar';\nimport { AttachFileButton } from '../AttachFileButton';\nimport { CommentInput } from '../CommentInputNext/CommentInputNext';\nimport EmojiIconButton from '../EmojiIconButton';\nimport FailedFileUploading from '../FailedFileUploading';\nimport UserMention from '../UserMention';\nimport { isSuggestionsListOpened } from '../UserMention/utils';\n\nimport {\n useAttachmentUpload,\n UploadedAttachment,\n DEFAULT_MAX_ATTACHMENTS,\n} from './useAttachmentUpload';\nimport { CommentMetaLine, CommentMetaRow } from './CommentMetaLine';\nimport { ShareToChatRow, ShareToChatRowProps } from './ShareToChatRow';\n\nimport styles from './CommentComposer.scss';\n\n/* eslint-disable camelcase -- mirrors the platform's snake_case user payload. */\nexport type CommentComposerUser = {\n id?: number;\n company_id?: number;\n first_name?: string;\n last_name?: string;\n profile_photo?: string;\n [key: string]: unknown;\n};\n/* eslint-enable camelcase */\n\nexport type CommentComposerProps = {\n body: string;\n onBodyChange: (value: string) => void;\n onSubmit: () => void;\n canSubmit: boolean;\n currentUser: CommentComposerUser;\n\n attachments?: UploadedAttachment[];\n onAttachmentsChange?: (attachments: UploadedAttachment[]) => void;\n maxAttachments?: number;\n /** @deprecated Use `attachments` — kept so single-attachment callers keep working. */\n attachment?: UploadedAttachment | null;\n /** @deprecated Use `onAttachmentsChange`. */\n onAttachmentChange?: (attachment: UploadedAttachment | null) => void;\n attachmentError?: string | null;\n onAttachmentError?: (message: string | null) => void;\n maxAttachmentSizeBytes?: number;\n\n disabled?: boolean;\n autoFocus?: boolean;\n placeholder?: string;\n metaRows?: CommentMetaRow[];\n isMetaSingleLine?: boolean;\n shareToChat?: Omit<ShareToChatRowProps, 'testId'>;\n /** Replaces the default send button, e.g. the edit form's Cancel/Save. */\n trailing?: ReactNode;\n /** Render flush inside a host card instead of as its own surface. */\n embedded?: boolean;\n className?: string;\n testId?: string;\n};\n\nconst SUGGESTIONS_BACKGROUND = 'var(--palette-background-b-9)';\n\n// Module-level so react-mentions isn't re-rendered on every keystroke.\nconst MENTION_INPUT_STYLE = {\n fontSize: 14,\n lineHeight: '20px',\n suggestions: {\n backgroundColor: SUGGESTIONS_BACKGROUND,\n list: { backgroundColor: SUGGESTIONS_BACKGROUND },\n item: {\n color: 'var(--palette-primary-text-1)',\n '&focused': { backgroundColor: 'rgb(from var(--palette-primary-text-1) r g b / 0.08)' },\n },\n },\n} as unknown as CSSProperties;\n\nconst renderSuggestion = (entry: { display: string; photo?: string }) => (\n <div className={styles.suggestion}>\n <Avatar size={26} alt={entry.display} imgSrc={entry.photo} displayName={entry.display} />\n <span>{entry.display}</span>\n </div>\n);\n\nexport const CommentComposer = ({\n body,\n onBodyChange,\n onSubmit,\n canSubmit,\n currentUser,\n attachments,\n onAttachmentsChange,\n maxAttachments = DEFAULT_MAX_ATTACHMENTS,\n attachment,\n onAttachmentChange,\n attachmentError,\n onAttachmentError,\n maxAttachmentSizeBytes,\n disabled,\n autoFocus,\n placeholder = 'Add a comment...',\n metaRows,\n isMetaSingleLine,\n shareToChat,\n trailing,\n embedded,\n className,\n testId,\n}: CommentComposerProps) => {\n // Callers still on the singular props get the old one-file behaviour, unchanged.\n const isMulti = !!onAttachmentsChange;\n const value = useMemo(\n () => (isMulti ? attachments ?? [] : ([attachment].filter(Boolean) as UploadedAttachment[])),\n [isMulti, attachments, attachment]\n );\n\n const handleAttachmentsChange = useCallback(\n (next: UploadedAttachment[]) => {\n if (onAttachmentsChange) onAttachmentsChange(next);\n else onAttachmentChange?.(next[0] ?? null);\n },\n [onAttachmentsChange, onAttachmentChange]\n );\n\n const upload = useAttachmentUpload({\n value,\n onChange: handleAttachmentsChange,\n onError: onAttachmentError,\n maxSizeBytes: maxAttachmentSizeBytes,\n maxFiles: isMulti ? maxAttachments : 1,\n });\n\n // An attachment only lands once S3 confirms, so posting mid-upload would drop it.\n const canSend = canSubmit && !upload.isUploading;\n\n const fieldRef = useRef<HTMLTextAreaElement | null>(null);\n\n // react-mentions opens suggestions from textarea events, so type \"@\" instead of setting state.\n const mentionSomeone = () => {\n const field = fieldRef.current;\n if (!field) return;\n\n field.focus();\n\n const needsSpace = !!field.value && !/\\s$/.test(field.value);\n const nextValue = `${field.value}${needsSpace ? ' @' : '@'}`;\n const setValue = Object.getOwnPropertyDescriptor(Object.getPrototypeOf(field), 'value')?.set;\n\n setValue?.call(field, nextValue);\n field.setSelectionRange(nextValue.length, nextValue.length);\n field.dispatchEvent(new Event('input', { bubbles: true }));\n field.dispatchEvent(new Event('keyup', { bubbles: true }));\n };\n\n const handleEnterKey = (event: KeyboardEvent) => {\n if (event.key !== 'Enter' || event.shiftKey) return;\n if (!canSend || disabled) return;\n if (isSuggestionsListOpened()) return;\n\n event.preventDefault();\n onSubmit();\n };\n\n return (\n <CommentInput\n value={body}\n canSubmit={canSend}\n disabled={disabled}\n onSubmit={onSubmit}\n trailing={trailing}\n embedded={embedded}\n className={className}\n testId={testId}\n field={\n <Input\n inputComponent={UserMention}\n inputProps={{\n // UserMention calls onChange with the text string, not a DOM event.\n onChange: onBodyChange as unknown as FormEventHandler<HTMLInputElement>,\n currentUser,\n allowEmptyQuery: true,\n suggestionsPortalHost: document.querySelector('body'),\n withLightTheme: false,\n mentionProps: { renderSuggestion },\n highlightLinks: true,\n style: MENTION_INPUT_STYLE,\n }}\n value={body}\n placeholder={placeholder}\n inputRef={fieldRef}\n className={styles.mentionField}\n onKeyDown={handleEnterKey}\n disableUnderline\n rows={1}\n fullWidth\n multiline\n autoFocus={autoFocus}\n />\n }\n attachments={upload.items}\n onAttachmentRemove={upload.removeAttachment}\n onAttachmentRetry={upload.handleRetry}\n onAttachmentReorder={isMulti ? upload.reorderAttachments : undefined}\n onFilesDrop={upload.addFiles}\n onImageLinkPaste={upload.addLinkedImage}\n dropLabel={upload.maxFiles === 1 ? 'Drop a file here' : 'Drop files here'}\n attachmentSlot={\n attachmentError ? <FailedFileUploading errorMessage={attachmentError} /> : undefined\n }\n toolbar={\n <>\n <AttachFileButton\n inputRef={upload.fileInputRef}\n onClick={upload.openFileDialog}\n onFileSelect={upload.handleFileSelect}\n multiple={isMulti}\n disabled={upload.isFull}\n tooltip={\n upload.isFull\n ? `Up to ${upload.maxFiles} ${\n upload.maxFiles === 1 ? 'file' : 'files'\n } can be attached`\n : 'Attach file'\n }\n />\n <Tooltip title=\"Mention someone\">\n <ButtonIcon size=\"xs\" type=\"tertiary\" onClick={mentionSomeone}>\n <AlternateEmailIcon fontSize=\"inherit\" />\n </ButtonIcon>\n </Tooltip>\n <span className={styles.iconSlot}>\n <EmojiIconButton\n icon={<SmilingFaceIcon size={16} />}\n handleSelectEmoji={(emoji: { native: string }) =>\n onBodyChange(`${body}${emoji.native}`)\n }\n />\n </span>\n </>\n }\n footer={\n (!!metaRows?.length || !!shareToChat) && (\n <>\n <CommentMetaLine rows={metaRows ?? []} singleLine={isMetaSingleLine} />\n {shareToChat && <ShareToChatRow {...shareToChat} />}\n </>\n )\n }\n />\n );\n};\n"],"names":["MENTION_INPUT_STYLE","fontSize","lineHeight","suggestions","backgroundColor","list","item","color","renderSuggestion","entry","_jsxs","className","styles","suggestion","children","_jsx","Avatar","size","alt","display","imgSrc","photo","displayName","CommentComposer","_ref","body","onBodyChange","onSubmit","canSubmit","currentUser","attachments","onAttachmentsChange","_ref$maxAttachments","maxAttachments","DEFAULT_MAX_ATTACHMENTS","attachment","onAttachmentChange","attachmentError","onAttachmentError","maxAttachmentSizeBytes","disabled","autoFocus","_ref$placeholder","placeholder","metaRows","isMetaSingleLine","shareToChat","trailing","embedded","testId","isMulti","value","useMemo","filter","Boolean","handleAttachmentsChange","useCallback","next","_next$","upload","useAttachmentUpload","onChange","onError","maxSizeBytes","maxFiles","canSend","isUploading","fieldRef","useRef","CommentInput","field","Input","inputComponent","UserMention","inputProps","allowEmptyQuery","suggestionsPortalHost","document","querySelector","withLightTheme","mentionProps","highlightLinks","style","inputRef","mentionField","onKeyDown","event","key","shiftKey","isSuggestionsListOpened","preventDefault","disableUnderline","rows","fullWidth","multiline","items","onAttachmentRemove","removeAttachment","onAttachmentRetry","handleRetry","onAttachmentReorder","reorderAttachments","undefined","onFilesDrop","addFiles","onImageLinkPaste","addLinkedImage","dropLabel","attachmentSlot","FailedFileUploading","errorMessage","toolbar","_Fragment","AttachFileButton","fileInputRef","onClick","openFileDialog","onFileSelect","handleFileSelect","multiple","isFull","tooltip","concat","Tooltip","title","ButtonIcon","type","_Object$getOwnPropert","current","focus","needsSpace","test","nextValue","setValue","Object","getOwnPropertyDescriptor","getPrototypeOf","set","call","setSelectionRange","length","dispatchEvent","Event","bubbles","AlternateEmailIcon","iconSlot","EmojiIconButton","icon","SmilingFaceIcon","handleSelectEmoji","emoji","native","footer","CommentMetaLine","singleLine","ShareToChatRow","_objectSpread"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CommentReplyInput.d.ts","sourceRoot":"","sources":["../../../src/components/CommentComposer/CommentReplyInput.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAuB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIhF,MAAM,MAAM,sBAAsB,GAAG;IACnC,6EAA6E;IAC7E,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,kBAAkB,EAAE,KAC9B,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,+HAW3B,sBAAsB,4CAsDxB,CAAC"}
1
+ {"version":3,"file":"CommentReplyInput.d.ts","sourceRoot":"","sources":["../../../src/components/CommentComposer/CommentReplyInput.tsx"],"names":[],"mappings":"AAOA,OAAO,EAAuB,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAIhF,MAAM,MAAM,sBAAsB,GAAG;IACnC,6EAA6E;IAC7E,QAAQ,EAAE,CACR,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,kBAAkB,EAAE,KAC9B,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC;IAC9C,MAAM,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAC1C,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,eAAO,MAAM,iBAAiB,+HAW3B,sBAAsB,4CAuDxB,CAAC"}
@@ -1,2 +1,2 @@
1
- import t from"@babel/runtime/helpers/asyncToGenerator";import e from"@babel/runtime/helpers/slicedToArray";import r from"@babel/runtime/regenerator";import{useState as a}from"react";import{Avatar as n}from"../../componentsV2/Avatar/Avatar.js";import{AttachFileButton as o}from"../AttachFileButton/AttachFileButton.js";import{CommentInput as i}from"../CommentInputNext/CommentInputNext.js";import l from"../FailedFileUploading.js";import{useAttachmentUpload as m}from"./useAttachmentUpload.js";import{jsx as c}from"react/jsx-runtime";var s=[],u=function(u){var p=u.onSubmit,d=u.author,h=u.disabled,f=u.placeholder,v=void 0===f?"Reply":f,b=u.autoFocus,A=void 0===b||b,F=u.maxAttachments,g=u.initialBody,x=void 0===g?"":g,y=u.initialAttachments,C=void 0===y?s:y,R=u.onCancel,S=u.testId,j=a(x),I=e(j,2),U=I[0],k=I[1],B=a(C),w=e(B,2),D=w[0],N=w[1],T=a(null),z=e(T,2),E=z[0],G=z[1],M=m({value:D,onChange:N,onError:G,maxFiles:F}),V=function(){var e=t(r.mark((function t(e){return r.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,p(e,D);case 2:if(t.t0=t.sent,!1!==t.t0){t.next=5;break}return t.abrupt("return");case 5:k(""),N([]),M.clearAttachments();case 8:case"end":return t.stop()}}),t)})));return function(t){return e.apply(this,arguments)}}();return c(i,{bare:!0,autoFocus:A,placeholder:v,value:U,onChange:k,canSubmit:!(!U.trim()&&!D.length||M.isUploading),onSubmit:V,onCancel:R,disabled:h,attachments:M.items,onAttachmentRemove:M.removeAttachment,onAttachmentRetry:M.handleRetry,onAttachmentReorder:M.reorderAttachments,onFilesDrop:M.addFiles,testId:S,attachmentSlot:E?c(l,{errorMessage:E}):void 0,toolbar:c(o,{inputRef:M.fileInputRef,onClick:M.openFileDialog,onFileSelect:M.handleFileSelect,multiple:!0,disabled:M.isFull,tooltip:M.isFull?"Up to ".concat(M.maxFiles," files can be attached"):"Attach file"}),leading:c(n,{size:32,name:null==d?void 0:d.name,imageSrc:null==d?void 0:d.avatarUrl})})};export{u as CommentReplyInput};
1
+ import t from"@babel/runtime/helpers/asyncToGenerator";import e from"@babel/runtime/helpers/slicedToArray";import a from"@babel/runtime/regenerator";import{useState as n}from"react";import{Avatar as r}from"../../componentsV2/Avatar/Avatar.js";import{AttachFileButton as o}from"../AttachFileButton/AttachFileButton.js";import{CommentInput as i}from"../CommentInputNext/CommentInputNext.js";import l from"../FailedFileUploading.js";import{useAttachmentUpload as m}from"./useAttachmentUpload.js";import{jsx as c}from"react/jsx-runtime";var s=[],u=function(u){var d=u.onSubmit,p=u.author,h=u.disabled,f=u.placeholder,v=void 0===f?"Reply":f,b=u.autoFocus,A=void 0===b||b,F=u.maxAttachments,g=u.initialBody,x=void 0===g?"":g,y=u.initialAttachments,C=void 0===y?s:y,I=u.onCancel,R=u.testId,S=n(x),j=e(S,2),k=j[0],U=j[1],B=n(C),w=e(B,2),D=w[0],L=w[1],N=n(null),T=e(N,2),z=T[0],E=T[1],G=m({value:D,onChange:L,onError:E,maxFiles:F}),M=function(){var e=t(a.mark((function t(e){return a.wrap((function(t){for(;;)switch(t.prev=t.next){case 0:return t.next=2,d(e,D);case 2:if(t.t0=t.sent,!1!==t.t0){t.next=5;break}return t.abrupt("return");case 5:U(""),L([]),G.clearAttachments();case 8:case"end":return t.stop()}}),t)})));return function(t){return e.apply(this,arguments)}}();return c(i,{bare:!0,autoFocus:A,placeholder:v,value:k,onChange:U,canSubmit:!(!k.trim()&&!D.length||G.isUploading),onSubmit:M,onCancel:I,disabled:h,attachments:G.items,onAttachmentRemove:G.removeAttachment,onAttachmentRetry:G.handleRetry,onAttachmentReorder:G.reorderAttachments,onFilesDrop:G.addFiles,onImageLinkPaste:G.addLinkedImage,testId:R,attachmentSlot:z?c(l,{errorMessage:z}):void 0,toolbar:c(o,{inputRef:G.fileInputRef,onClick:G.openFileDialog,onFileSelect:G.handleFileSelect,multiple:!0,disabled:G.isFull,tooltip:G.isFull?"Up to ".concat(G.maxFiles," files can be attached"):"Attach file"}),leading:c(r,{size:32,name:null==p?void 0:p.name,imageSrc:null==p?void 0:p.avatarUrl})})};export{u as CommentReplyInput};
2
2
  //# sourceMappingURL=CommentReplyInput.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentReplyInput.js","sources":["../../../src/components/CommentComposer/CommentReplyInput.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Avatar } from '../../componentsV2/Avatar';\nimport { AttachFileButton } from '../AttachFileButton';\nimport { CommentInput } from '../CommentInputNext/CommentInputNext';\nimport FailedFileUploading from '../FailedFileUploading';\n\nimport { useAttachmentUpload, UploadedAttachment } from './useAttachmentUpload';\n\nconst EMPTY_ATTACHMENTS: UploadedAttachment[] = [];\n\nexport type CommentReplyInputProps = {\n /** Resolving to `false` keeps the draft, so a failed post can be retried. */\n onSubmit: (\n body: string,\n attachments: UploadedAttachment[]\n ) => void | boolean | Promise<void | boolean>;\n author?: { name?: string; avatarUrl?: string };\n disabled?: boolean;\n placeholder?: string;\n autoFocus?: boolean;\n maxAttachments?: number;\n initialBody?: string;\n initialAttachments?: UploadedAttachment[];\n onCancel?: () => void;\n testId?: string;\n};\n\nexport const CommentReplyInput = ({\n onSubmit,\n author,\n disabled,\n placeholder = 'Reply',\n autoFocus = true,\n maxAttachments,\n initialBody = '',\n initialAttachments = EMPTY_ATTACHMENTS,\n onCancel,\n testId,\n}: CommentReplyInputProps) => {\n const [body, setBody] = useState(initialBody);\n const [attachments, setAttachments] = useState<UploadedAttachment[]>(initialAttachments);\n const [attachmentError, setAttachmentError] = useState<string | null>(null);\n\n const upload = useAttachmentUpload({\n value: attachments,\n onChange: setAttachments,\n onError: setAttachmentError,\n maxFiles: maxAttachments,\n });\n\n const handleSubmit = async (value: string) => {\n if ((await onSubmit(value, attachments)) === false) return;\n\n setBody('');\n setAttachments([]);\n upload.clearAttachments();\n };\n\n return (\n <CommentInput\n bare\n autoFocus={autoFocus}\n placeholder={placeholder}\n value={body}\n onChange={setBody}\n // An attachment only lands once S3 confirms, so posting mid-upload would drop it.\n canSubmit={(!!body.trim() || !!attachments.length) && !upload.isUploading}\n onSubmit={handleSubmit}\n onCancel={onCancel}\n disabled={disabled}\n attachments={upload.items}\n onAttachmentRemove={upload.removeAttachment}\n onAttachmentRetry={upload.handleRetry}\n onAttachmentReorder={upload.reorderAttachments}\n onFilesDrop={upload.addFiles}\n testId={testId}\n attachmentSlot={\n attachmentError ? <FailedFileUploading errorMessage={attachmentError} /> : undefined\n }\n toolbar={\n <AttachFileButton\n inputRef={upload.fileInputRef}\n onClick={upload.openFileDialog}\n onFileSelect={upload.handleFileSelect}\n multiple\n disabled={upload.isFull}\n tooltip={upload.isFull ? `Up to ${upload.maxFiles} files can be attached` : 'Attach file'}\n />\n }\n leading={<Avatar size={32} name={author?.name} imageSrc={author?.avatarUrl} />}\n />\n );\n};\n"],"names":["EMPTY_ATTACHMENTS","CommentReplyInput","_ref","onSubmit","author","disabled","_ref$placeholder","placeholder","_ref$autoFocus","autoFocus","maxAttachments","_ref$initialBody","initialBody","_ref$initialAttachmen","initialAttachments","onCancel","testId","useState","_useState2","_slicedToArray","_useState","body","setBody","_useState4","_useState3","attachments","setAttachments","_useState6","_useState5","attachmentError","setAttachmentError","upload","useAttachmentUpload","value","onChange","onError","maxFiles","handleSubmit","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","wrap","_context","prev","next","t0","sent","abrupt","clearAttachments","stop","_callee","_x","apply","this","arguments","_jsx","CommentInput","bare","canSubmit","trim","length","isUploading","items","onAttachmentRemove","removeAttachment","onAttachmentRetry","handleRetry","onAttachmentReorder","reorderAttachments","onFilesDrop","addFiles","attachmentSlot","FailedFileUploading","errorMessage","undefined","toolbar","AttachFileButton","inputRef","fileInputRef","onClick","openFileDialog","onFileSelect","handleFileSelect","multiple","isFull","tooltip","leading","Avatar","size","name","imageSrc","avatarUrl"],"mappings":"qhBASA,IAAMA,EAA0C,GAmBnCC,EAAoB,SAWHC,GAAA,IAV5BC,IAAAA,SACAC,IAAAA,OACAC,IAAAA,SAAQC,EAAAJ,EACRK,YAAAA,aAAc,QAAOD,EAAAE,EAAAN,EACrBO,UAAAA,cAAgBD,EAChBE,IAAAA,eAAcC,EAAAT,EACdU,YAAAA,aAAc,GAAED,EAAAE,EAAAX,EAChBY,mBAAAA,aAAqBd,EAAiBa,EACtCE,IAAAA,SACAC,IAAAA,OAEwBC,EAAAA,EAASL,GAAYM,EAAAC,EAAAC,EAAA,GAAtCC,EAAIH,EAAA,GAAEI,EAAOJ,EAAA,GACkBD,EAAAA,EAA+BH,GAAmBS,EAAAJ,EAAAK,EAAA,GAAjFC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GACYN,EAAAA,EAAwB,MAAKU,EAAAR,EAAAS,EAAA,GAApEC,EAAeF,EAAA,GAAEG,EAAkBH,EAAA,GAEpCI,EAASC,EAAoB,CACjCC,MAAOR,EACPS,SAAUR,EACVS,QAASL,EACTM,SAAU1B,IAGN2B,EAAY,WAAA,IAAAC,EAAAC,EAAAC,EAAAC,MAAG,WAAOR,GAAa,OAAAO,EAAAE,MAAA,SAAAC,GAAA,OAAA,OAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EAC5B1C,EAAS8B,EAAOR,GAAY,KAAA,EAAA,GAAAkB,EAAAG,GAAAH,EAAAI,MAAM,IAANJ,EAAAG,GAAW,CAAAH,EAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,EAAAK,OAAA,UAAA,KAAA,EAElD1B,EAAQ,IACRI,EAAe,IACfK,EAAOkB,mBAAmB,KAAA,EAAA,IAAA,MAAA,OAAAN,EAAAO,OAAA,GAAAC,EAC3B,KAAA,OAAA,SANiBC,GAAA,OAAAd,EAAAe,MAAAC,KAAAC,UAAA,EAAA,GAQlB,OACEC,EAACC,EAAY,CACXC,MAAI,EACJjD,UAAWA,EACXF,YAAaA,EACb0B,MAAOZ,EACPa,SAAUZ,EAEVqC,aAActC,EAAKuC,SAAYnC,EAAYoC,QAAY9B,EAAO+B,aAC9D3D,SAAUkC,EACVtB,SAAUA,EACVV,SAAUA,EACVoB,YAAaM,EAAOgC,MACpBC,mBAAoBjC,EAAOkC,iBAC3BC,kBAAmBnC,EAAOoC,YAC1BC,oBAAqBrC,EAAOsC,mBAC5BC,YAAavC,EAAOwC,SACpBvD,OAAQA,EACRwD,eACE3C,EAAkB2B,EAACiB,EAAmB,CAACC,aAAc7C,SAAsB8C,EAE7EC,QACEpB,EAACqB,EAAgB,CACfC,SAAU/C,EAAOgD,aACjBC,QAASjD,EAAOkD,eAChBC,aAAcnD,EAAOoD,iBACrBC,UAAQ,EACR/E,SAAU0B,EAAOsD,OACjBC,QAASvD,EAAOsD,uBAAkBtD,EAAOK,SAAmC,0BAAA,gBAGhFmD,QAAS/B,EAACgC,EAAM,CAACC,KAAM,GAAIC,KAAMtF,aAAAA,EAAAA,EAAQsF,KAAMC,SAAUvF,aAAM,EAANA,EAAQwF,aAGvE"}
1
+ {"version":3,"file":"CommentReplyInput.js","sources":["../../../src/components/CommentComposer/CommentReplyInput.tsx"],"sourcesContent":["import { useState } from 'react';\n\nimport { Avatar } from '../../componentsV2/Avatar';\nimport { AttachFileButton } from '../AttachFileButton';\nimport { CommentInput } from '../CommentInputNext/CommentInputNext';\nimport FailedFileUploading from '../FailedFileUploading';\n\nimport { useAttachmentUpload, UploadedAttachment } from './useAttachmentUpload';\n\nconst EMPTY_ATTACHMENTS: UploadedAttachment[] = [];\n\nexport type CommentReplyInputProps = {\n /** Resolving to `false` keeps the draft, so a failed post can be retried. */\n onSubmit: (\n body: string,\n attachments: UploadedAttachment[]\n ) => void | boolean | Promise<void | boolean>;\n author?: { name?: string; avatarUrl?: string };\n disabled?: boolean;\n placeholder?: string;\n autoFocus?: boolean;\n maxAttachments?: number;\n initialBody?: string;\n initialAttachments?: UploadedAttachment[];\n onCancel?: () => void;\n testId?: string;\n};\n\nexport const CommentReplyInput = ({\n onSubmit,\n author,\n disabled,\n placeholder = 'Reply',\n autoFocus = true,\n maxAttachments,\n initialBody = '',\n initialAttachments = EMPTY_ATTACHMENTS,\n onCancel,\n testId,\n}: CommentReplyInputProps) => {\n const [body, setBody] = useState(initialBody);\n const [attachments, setAttachments] = useState<UploadedAttachment[]>(initialAttachments);\n const [attachmentError, setAttachmentError] = useState<string | null>(null);\n\n const upload = useAttachmentUpload({\n value: attachments,\n onChange: setAttachments,\n onError: setAttachmentError,\n maxFiles: maxAttachments,\n });\n\n const handleSubmit = async (value: string) => {\n if ((await onSubmit(value, attachments)) === false) return;\n\n setBody('');\n setAttachments([]);\n upload.clearAttachments();\n };\n\n return (\n <CommentInput\n bare\n autoFocus={autoFocus}\n placeholder={placeholder}\n value={body}\n onChange={setBody}\n // An attachment only lands once S3 confirms, so posting mid-upload would drop it.\n canSubmit={(!!body.trim() || !!attachments.length) && !upload.isUploading}\n onSubmit={handleSubmit}\n onCancel={onCancel}\n disabled={disabled}\n attachments={upload.items}\n onAttachmentRemove={upload.removeAttachment}\n onAttachmentRetry={upload.handleRetry}\n onAttachmentReorder={upload.reorderAttachments}\n onFilesDrop={upload.addFiles}\n onImageLinkPaste={upload.addLinkedImage}\n testId={testId}\n attachmentSlot={\n attachmentError ? <FailedFileUploading errorMessage={attachmentError} /> : undefined\n }\n toolbar={\n <AttachFileButton\n inputRef={upload.fileInputRef}\n onClick={upload.openFileDialog}\n onFileSelect={upload.handleFileSelect}\n multiple\n disabled={upload.isFull}\n tooltip={upload.isFull ? `Up to ${upload.maxFiles} files can be attached` : 'Attach file'}\n />\n }\n leading={<Avatar size={32} name={author?.name} imageSrc={author?.avatarUrl} />}\n />\n );\n};\n"],"names":["EMPTY_ATTACHMENTS","CommentReplyInput","_ref","onSubmit","author","disabled","_ref$placeholder","placeholder","_ref$autoFocus","autoFocus","maxAttachments","_ref$initialBody","initialBody","_ref$initialAttachmen","initialAttachments","onCancel","testId","useState","_useState2","_slicedToArray","_useState","body","setBody","_useState4","_useState3","attachments","setAttachments","_useState6","_useState5","attachmentError","setAttachmentError","upload","useAttachmentUpload","value","onChange","onError","maxFiles","handleSubmit","_ref2","_asyncToGenerator","_regeneratorRuntime","mark","wrap","_context","prev","next","t0","sent","abrupt","clearAttachments","stop","_callee","_x","apply","this","arguments","_jsx","CommentInput","bare","canSubmit","trim","length","isUploading","items","onAttachmentRemove","removeAttachment","onAttachmentRetry","handleRetry","onAttachmentReorder","reorderAttachments","onFilesDrop","addFiles","onImageLinkPaste","addLinkedImage","attachmentSlot","FailedFileUploading","errorMessage","undefined","toolbar","AttachFileButton","inputRef","fileInputRef","onClick","openFileDialog","onFileSelect","handleFileSelect","multiple","isFull","tooltip","leading","Avatar","size","name","imageSrc","avatarUrl"],"mappings":"qhBASA,IAAMA,EAA0C,GAmBnCC,EAAoB,SAWHC,GAAA,IAV5BC,IAAAA,SACAC,IAAAA,OACAC,IAAAA,SAAQC,EAAAJ,EACRK,YAAAA,aAAc,QAAOD,EAAAE,EAAAN,EACrBO,UAAAA,cAAgBD,EAChBE,IAAAA,eAAcC,EAAAT,EACdU,YAAAA,aAAc,GAAED,EAAAE,EAAAX,EAChBY,mBAAAA,aAAqBd,EAAiBa,EACtCE,IAAAA,SACAC,IAAAA,OAEwBC,EAAAA,EAASL,GAAYM,EAAAC,EAAAC,EAAA,GAAtCC,EAAIH,EAAA,GAAEI,EAAOJ,EAAA,GACkBD,EAAAA,EAA+BH,GAAmBS,EAAAJ,EAAAK,EAAA,GAAjFC,EAAWF,EAAA,GAAEG,EAAcH,EAAA,GACYN,EAAAA,EAAwB,MAAKU,EAAAR,EAAAS,EAAA,GAApEC,EAAeF,EAAA,GAAEG,EAAkBH,EAAA,GAEpCI,EAASC,EAAoB,CACjCC,MAAOR,EACPS,SAAUR,EACVS,QAASL,EACTM,SAAU1B,IAGN2B,EAAY,WAAA,IAAAC,EAAAC,EAAAC,EAAAC,MAAG,WAAOR,GAAa,OAAAO,EAAAE,MAAA,SAAAC,GAAA,OAAA,OAAAA,EAAAC,KAAAD,EAAAE,MAAA,KAAA,EAAA,OAAAF,EAAAE,KAAA,EAC5B1C,EAAS8B,EAAOR,GAAY,KAAA,EAAA,GAAAkB,EAAAG,GAAAH,EAAAI,MAAM,IAANJ,EAAAG,GAAW,CAAAH,EAAAE,KAAA,EAAA,KAAA,CAAA,OAAAF,EAAAK,OAAA,UAAA,KAAA,EAElD1B,EAAQ,IACRI,EAAe,IACfK,EAAOkB,mBAAmB,KAAA,EAAA,IAAA,MAAA,OAAAN,EAAAO,OAAA,GAAAC,EAC3B,KAAA,OAAA,SANiBC,GAAA,OAAAd,EAAAe,MAAAC,KAAAC,UAAA,EAAA,GAQlB,OACEC,EAACC,EAAY,CACXC,MAAI,EACJjD,UAAWA,EACXF,YAAaA,EACb0B,MAAOZ,EACPa,SAAUZ,EAEVqC,aAActC,EAAKuC,SAAYnC,EAAYoC,QAAY9B,EAAO+B,aAC9D3D,SAAUkC,EACVtB,SAAUA,EACVV,SAAUA,EACVoB,YAAaM,EAAOgC,MACpBC,mBAAoBjC,EAAOkC,iBAC3BC,kBAAmBnC,EAAOoC,YAC1BC,oBAAqBrC,EAAOsC,mBAC5BC,YAAavC,EAAOwC,SACpBC,iBAAkBzC,EAAO0C,eACzBzD,OAAQA,EACR0D,eACE7C,EAAkB2B,EAACmB,EAAmB,CAACC,aAAc/C,SAAsBgD,EAE7EC,QACEtB,EAACuB,EAAgB,CACfC,SAAUjD,EAAOkD,aACjBC,QAASnD,EAAOoD,eAChBC,aAAcrD,EAAOsD,iBACrBC,UAAQ,EACRjF,SAAU0B,EAAOwD,OACjBC,QAASzD,EAAOwD,uBAAkBxD,EAAOK,SAAmC,0BAAA,gBAGhFqD,QAASjC,EAACkC,EAAM,CAACC,KAAM,GAAIC,KAAMxF,aAAAA,EAAAA,EAAQwF,KAAMC,SAAUzF,aAAM,EAANA,EAAQ0F,aAGvE"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useAttachmentUpload.linked.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAttachmentUpload.linked.test.d.ts","sourceRoot":"","sources":["../../../../src/components/CommentComposer/__tests__/useAttachmentUpload.linked.test.tsx"],"names":[],"mappings":""}
@@ -21,6 +21,7 @@ export declare const useAttachmentUpload: ({ value, onChange, onError, maxSizeBy
21
21
  openFileDialog: () => void | undefined;
22
22
  handleFileSelect: (event: ChangeEvent<HTMLInputElement>) => void;
23
23
  addFiles: (files: File[]) => void;
24
+ addLinkedImage: (url: string) => void;
24
25
  removeAttachment: (id: AttachmentPreviewItem['id']) => void;
25
26
  handleRetry: (id: AttachmentPreviewItem['id']) => void;
26
27
  reorderAttachments: (orderedIds: AttachmentPreviewItem['id'][]) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"useAttachmentUpload.d.ts","sourceRoot":"","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA4C,MAAM,OAAO,CAAC;AAG9E,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,8CAA8C,CAAC;AAMtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAcF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAkD1C,eAAO,MAAM,mBAAmB,kEAO7B,0BAA0B;;;;8BA0KjB,WAAW,CAAC,gBAAgB,CAAC;sBApD7B,IAAI,EAAE;2BAgET,qBAAqB,CAAC,IAAI,CAAC;sBAW3B,qBAAqB,CAAC,IAAI,CAAC;qCAcnB,qBAAqB,CAAC,IAAI,CAAC,EAAE;;;;;;;CA8G7C,CAAC"}
1
+ {"version":3,"file":"useAttachmentUpload.d.ts","sourceRoot":"","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA4C,MAAM,OAAO,CAAC;AAG9E,OAAO,KAAK,EAEV,qBAAqB,EACtB,MAAM,8CAA8C,CAAC;AAOtD,MAAM,MAAM,kBAAkB,GAAG;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf,CAAC;AAEF,KAAK,0BAA0B,GAAG;IAChC,KAAK,EAAE,kBAAkB,EAAE,CAAC;IAC5B,QAAQ,EAAE,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,IAAI,CAAC;IACtD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAcF,eAAO,MAAM,uBAAuB,KAAK,CAAC;AAkD1C,eAAO,MAAM,mBAAmB,kEAO7B,0BAA0B;;;;8BAwMjB,WAAW,CAAC,gBAAgB,CAAC;sBApD7B,IAAI,EAAE;0BA7BR,MAAM;2BA6FP,qBAAqB,CAAC,IAAI,CAAC;sBAW3B,qBAAqB,CAAC,IAAI,CAAC;qCAcnB,qBAAqB,CAAC,IAAI,CAAC,EAAE;;;;;;;CAkH7C,CAAC"}
@@ -1,2 +1,2 @@
1
- import r from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/asyncToGenerator";import n from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/slicedToArray";import i from"@babel/runtime/regenerator";import{useState as o,useRef as u,useCallback as l,useEffect as c}from"react";import a from"react-s3-uploader/s3upload";import{getAttachmentKind as f}from"../AttachmentPreview/getAttachmentKind.js";import{ACCEPTED_ATTACHMENT_TYPES as s}from"../AttachFileButton/AttachFileButton.js";import{getS3SignedUrl as d,getS3DownloadLink as p}from"../../clients/jsonApi/index.js";function v(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.push.apply(n,t)}return n}function m(r){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?v(Object(t),!0).forEach((function(e){n(r,e,t[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):v(Object(t)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(t,e))}))}return r}var h=10,g=function(r){return r.type.startsWith("image/")?"image":r.type.startsWith("video/")?"video":"file"},b=function(r){return(r/1048576).toFixed(1)},U=function(r){return{id:r.url,name:r.name,file:null,previewUrl:"",isUploading:!1,error:null,uploaded:r}},w=0,y=function(n){var v,h,y=n.value,O=n.onChange,j=n.onError,F=n.maxSizeBytes,x=n.maxFiles,k=void 0===x?10:x,P=n.accept,L=void 0===P?s:P,A=o([]),S=t(A,2),E=S[0],R=S[1],B=u(null),z=u(new Map),C=u(new Map),M=u([]),W=u(O),D=u(j);W.current=O,D.current=j;var T=u([]),_=l((function(r){var e=r(M.current);M.current=e,R(e),T.current=function(r){return r.map((function(r){return r.uploaded})).filter(Boolean)}(e),W.current(T.current)}),[]),G=l((function(r,e){return _((function(n){return n.map((function(n){return n.id===r?m(m({},n),e):n}))}))}),[_]),I=l((function(r){var e,n;null===(e=z.current.get(r))||void 0===e||e.abortUpload(),z.current.delete(r),C.current.set(r,(null!==(n=C.current.get(r))&&void 0!==n?n:0)+1)}),[]),K=l((function(r){null!=r&&r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}),[]),Y=l((function(){var r,e,n;null===(r=D.current)||void 0===r||r.call(D,null!==(e=null===(n=M.current.find((function(r){return r.error})))||void 0===n?void 0:n.error)&&void 0!==e?e:null)}),[]);c((function(){return function(){z.current.forEach((function(r){return r.abortUpload()})),z.current.clear(),M.current.forEach((function(r){r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}))}}),[]);var q=l((function(r,n){var t,o=(null!==(t=C.current.get(r))&&void 0!==t?t:0)+1;C.current.set(r,o);var u,l,c=function(){return C.current.get(r)===o},f=function(e){var n;c()&&(G(r,{isUploading:!1,error:e}),null===(n=D.current)||void 0===n||n.call(D,e))},s="",v=new a({files:[n],preprocess:function(r,e){return e(r)},onProgress:function(){},getSignedUrl:(l=e(i.mark((function r(e,n){var t;return i.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,d(e.name,e.type);case 3:t=r.sent,s=t.file_name,n(m(m({},t),{},{signedUrl:t.signed_url})),r.next=11;break;case 8:r.prev=8,r.t0=r.catch(0),f((null===r.t0||void 0===r.t0?void 0:r.t0.message)||"Failed to upload the file");case 11:case"end":return r.stop()}}),r,null,[[0,8]])}))),function(r,e){return l.apply(this,arguments)}),onFinishS3Put:(u=e(i.mark((function e(){var t,o;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,p(s);case 3:if(t=e.sent,o=t.url,c()){e.next=7;break}return e.abrupt("return");case 7:z.current.delete(r),G(r,{isUploading:!1,error:null,uploaded:{url:o,name:s,size:n.size}}),Y(),e.next=15;break;case 12:e.prev=12,e.t0=e.catch(0),f((null===e.t0||void 0===e.t0?void 0:e.t0.message)||"Failed to upload the file");case 15:case"end":return e.stop()}}),e,null,[[0,12]])}))),function(){return u.apply(this,arguments)}),onError:function(r){return f(r||"Failed to upload the file")}});z.current.set(r,v)}),[G,Y]),H=l((function(e){var n,t,i,o,u=e.filter((function(r){return function(r,e){return e.split(",").map((function(r){return r.trim().toLowerCase()})).filter(Boolean).some((function(e){if(e.startsWith("."))return r.name.toLowerCase().endsWith(e);if(e.endsWith("/*")){var n=r.type.toLowerCase();return n?n.startsWith(e.slice(0,-1)):f({name:r.name})===e.slice(0,-1)}return r.type.toLowerCase()===e}))}(r,L)})),l=u.length<e.length?1===e.length?"That file type is not supported.":"Some files were skipped — unsupported file type.":null,c="You can attach up to ".concat(k," files."),a=k-M.current.length;if(!u.length||a<=0){var s;null===(s=D.current)||void 0===s||s.call(D,u.length?c:l)}else{var d=u.slice(0,a),p=d.map((function(r){var e=g(r),n=!!F&&r.size>F;return{id:"attachment-".concat(w+=1),name:r.name,file:r,previewUrl:"file"===e?"":URL.createObjectURL(r),isUploading:!n,error:n?"File is too large (".concat(b(r.size)," MB). Maximum size is ").concat(b(F)," MB."):null,uploaded:null}}));_((function(e){return[].concat(r(e),r(p))}));var v=u.length>d.length?c:null;null===(n=D.current)||void 0===n||n.call(D,null!==(t=null!==(i=null===(o=M.current.find((function(r){return r.error})))||void 0===o?void 0:o.error)&&void 0!==i?i:l)&&void 0!==t?t:v),p.filter((function(r){return!r.error})).forEach((function(r){return q(r.id,r.file)}))}}),[_,k,F,q,L]),J=l((function(r){var e,n=Array.from(null!==(e=r.target.files)&&void 0!==e?e:[]);B.current&&(B.current.value=""),n.length&&H(n)}),[H]),N=l((function(){var r;return null===(r=B.current)||void 0===r?void 0:r.click()}),[]),Q=l((function(r){var e=String(r);I(e),K(M.current.find((function(r){return r.id===e}))),_((function(r){return r.filter((function(r){return r.id!==e}))})),Y()}),[I,K,_,Y]),V=l((function(r){var e=String(r),n=M.current.find((function(r){return r.id===e}));null!=n&&n.file&&(I(e),G(e,{isUploading:!0,error:null}),Y(),q(e,n.file))}),[I,G,q,Y]),X=l((function(e){return _((function(n){var t=new Map(n.map((function(r){return[r.id,r]}))),i=e.map((function(r){return t.get(String(r))})).filter(Boolean),o=n.filter((function(r){return!e.some((function(e){return String(e)===r.id}))}));return[].concat(r(i),r(o))}))}),[_]),Z=l((function(){var r;M.current.forEach((function(r){I(r.id),K(r)})),_((function(){return[]})),null===(r=D.current)||void 0===r||r.call(D,null)}),[I,_,K]);c((function(){var r,e,n;(e=T.current,n=y,e.length===n.length&&e.every((function(r,e){return r.url===n[e].url})))||(M.current.forEach((function(r){I(r.id),r.previewUrl&&URL.revokeObjectURL(r.previewUrl)})),M.current=y.map(U),T.current=y,R(M.current),null===(r=D.current)||void 0===r||r.call(D,null))}),[y,I]);var $=o({}),rr=t($,2),er=rr[0],nr=rr[1],tr=u(er);tr.current=er;var ir=E.filter((function(r){return!r.file&&r.uploaded})).map((function(r){return r.uploaded.name})).join("|");return c((function(){var r=ir.split("|").filter((function(r){return r&&!(r in tr.current)}));if(r.length){var e=!0;return Promise.all(r.map((function(r){return p(r,"inline").then((function(e){var n=e.url;return[r,n]})).catch((function(e){return console.error('Failed to sign stored attachment "'.concat(r,'"'),e),[r,""]}))}))).then((function(r){e&&nr((function(e){return m(m({},e),Object.fromEntries(r))}))})),function(){e=!1}}}),[ir]),{items:E.reduce((function(r,e){var n;if(e.file)return r.push({id:e.id,name:e.name,src:e.previewUrl,kind:g(e.file),isUploading:e.isUploading,error:null!==(n=e.error)&&void 0!==n?n:void 0}),r;var t=e.uploaded,i=f(t),o=er[t.name];return"file"===i||o?(r.push({id:e.id,name:t.name,src:o,kind:i}),r):r}),[]),fileInputRef:B,openFileDialog:N,handleFileSelect:J,addFiles:H,removeAttachment:Q,handleRetry:V,reorderAttachments:X,clearAttachments:Z,isUploading:E.some((function(r){return r.isUploading})),error:null!==(v=null===(h=E.find((function(r){return r.error})))||void 0===h?void 0:h.error)&&void 0!==v?v:null,count:E.length,isFull:E.length>=k,maxFiles:k}};export{h as DEFAULT_MAX_ATTACHMENTS,y as useAttachmentUpload};
1
+ import r from"@babel/runtime/helpers/toConsumableArray";import e from"@babel/runtime/helpers/asyncToGenerator";import n from"@babel/runtime/helpers/defineProperty";import t from"@babel/runtime/helpers/slicedToArray";import i from"@babel/runtime/regenerator";import{useState as u,useRef as o,useCallback as l,useEffect as c}from"react";import a from"react-s3-uploader/s3upload";import{getAttachmentKind as f}from"../AttachmentPreview/getAttachmentKind.js";import{ACCEPTED_ATTACHMENT_TYPES as s}from"../AttachFileButton/AttachFileButton.js";import{getS3SignedUrl as d,getS3DownloadLink as p}from"../../clients/jsonApi/index.js";import{getUrlFileName as v}from"../../utils/links.js";function m(r,e){var n=Object.keys(r);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(r);e&&(t=t.filter((function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable}))),n.push.apply(n,t)}return n}function h(r){for(var e=1;e<arguments.length;e++){var t=null!=arguments[e]?arguments[e]:{};e%2?m(Object(t),!0).forEach((function(e){n(r,e,t[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(r,Object.getOwnPropertyDescriptors(t)):m(Object(t)).forEach((function(e){Object.defineProperty(r,e,Object.getOwnPropertyDescriptor(t,e))}))}return r}var g=10,b=function(r){return r.type.startsWith("image/")?"image":r.type.startsWith("video/")?"video":"file"},U=function(r){return(r/1048576).toFixed(1)},w=function(r){return{id:r.url,name:r.name,file:null,previewUrl:"",isUploading:!1,error:null,uploaded:r}},y=0,j=function(){return"attachment-".concat(y+=1)},O=function(n){var m,g,y=n.value,O=n.onChange,k=n.onError,F=n.maxSizeBytes,x=n.maxFiles,L=void 0===x?10:x,P=n.accept,A=void 0===P?s:P,S=u([]),z=t(S,2),E=z[0],R=z[1],B=o(null),C=o(new Map),M=o(new Map),W=o([]),D=o(O),T=o(k);D.current=O,T.current=k;var I=o([]),Y=l((function(r){var e=r(W.current);W.current=e,R(e),I.current=function(r){return r.map((function(r){return r.uploaded})).filter(Boolean)}(e),D.current(I.current)}),[]),_=l((function(r,e){return Y((function(n){return n.map((function(n){return n.id===r?h(h({},n),e):n}))}))}),[Y]),G=l((function(r){var e,n;null===(e=C.current.get(r))||void 0===e||e.abortUpload(),C.current.delete(r),M.current.set(r,(null!==(n=M.current.get(r))&&void 0!==n?n:0)+1)}),[]),K=l((function(r){null!=r&&r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}),[]),q=l((function(){var r,e,n;null===(r=T.current)||void 0===r||r.call(T,null!==(e=null===(n=W.current.find((function(r){return r.error})))||void 0===n?void 0:n.error)&&void 0!==e?e:null)}),[]);c((function(){return function(){C.current.forEach((function(r){return r.abortUpload()})),C.current.clear(),W.current.forEach((function(r){r.previewUrl&&URL.revokeObjectURL(r.previewUrl)}))}}),[]);var H=l((function(r,n){var t,u=(null!==(t=M.current.get(r))&&void 0!==t?t:0)+1;M.current.set(r,u);var o,l,c=function(){return M.current.get(r)===u},f=function(e){var n;c()&&(_(r,{isUploading:!1,error:e}),null===(n=T.current)||void 0===n||n.call(T,e))},s="",v=new a({files:[n],preprocess:function(r,e){return e(r)},onProgress:function(){},getSignedUrl:(l=e(i.mark((function r(e,n){var t;return i.wrap((function(r){for(;;)switch(r.prev=r.next){case 0:return r.prev=0,r.next=3,d(e.name,e.type);case 3:t=r.sent,s=t.file_name,n(h(h({},t),{},{signedUrl:t.signed_url})),r.next=11;break;case 8:r.prev=8,r.t0=r.catch(0),f((null===r.t0||void 0===r.t0?void 0:r.t0.message)||"Failed to upload the file");case 11:case"end":return r.stop()}}),r,null,[[0,8]])}))),function(r,e){return l.apply(this,arguments)}),onFinishS3Put:(o=e(i.mark((function e(){var t,u;return i.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,e.next=3,p(s);case 3:if(t=e.sent,u=t.url,c()){e.next=7;break}return e.abrupt("return");case 7:C.current.delete(r),_(r,{isUploading:!1,error:null,uploaded:{url:u,name:s,size:n.size}}),q(),e.next=15;break;case 12:e.prev=12,e.t0=e.catch(0),f((null===e.t0||void 0===e.t0?void 0:e.t0.message)||"Failed to upload the file");case 15:case"end":return e.stop()}}),e,null,[[0,12]])}))),function(){return o.apply(this,arguments)}),onError:function(r){return f(r||"Failed to upload the file")}});C.current.set(r,v)}),[_,q]),J=l((function(e){var n,t=v(e);t&&(W.current.length>=L?null===(n=T.current)||void 0===n||n.call(T,"You can attach up to ".concat(L," files.")):W.current.some((function(r){var n;return(null===(n=r.uploaded)||void 0===n?void 0:n.url)===e}))||Y((function(n){return[].concat(r(n),[{id:j(),name:t,file:null,previewUrl:e,isUploading:!1,error:null,uploaded:{url:e,name:t}}])})))}),[Y,L]),N=l((function(e){var n,t,i,u,o=e.filter((function(r){return function(r,e){return e.split(",").map((function(r){return r.trim().toLowerCase()})).filter(Boolean).some((function(e){if(e.startsWith("."))return r.name.toLowerCase().endsWith(e);if(e.endsWith("/*")){var n=r.type.toLowerCase();return n?n.startsWith(e.slice(0,-1)):f({name:r.name})===e.slice(0,-1)}return r.type.toLowerCase()===e}))}(r,A)})),l=o.length<e.length?1===e.length?"That file type is not supported.":"Some files were skipped — unsupported file type.":null,c="You can attach up to ".concat(L," files."),a=L-W.current.length;if(!o.length||a<=0){var s;null===(s=T.current)||void 0===s||s.call(T,o.length?c:l)}else{var d=o.slice(0,a),p=d.map((function(r){var e=b(r),n=!!F&&r.size>F;return{id:j(),name:r.name,file:r,previewUrl:"file"===e?"":URL.createObjectURL(r),isUploading:!n,error:n?"File is too large (".concat(U(r.size)," MB). Maximum size is ").concat(U(F)," MB."):null,uploaded:null}}));Y((function(e){return[].concat(r(e),r(p))}));var v=o.length>d.length?c:null;null===(n=T.current)||void 0===n||n.call(T,null!==(t=null!==(i=null===(u=W.current.find((function(r){return r.error})))||void 0===u?void 0:u.error)&&void 0!==i?i:l)&&void 0!==t?t:v),p.filter((function(r){return!r.error})).forEach((function(r){return H(r.id,r.file)}))}}),[Y,L,F,H,A]),Q=l((function(r){var e,n=Array.from(null!==(e=r.target.files)&&void 0!==e?e:[]);B.current&&(B.current.value=""),n.length&&N(n)}),[N]),V=l((function(){var r;return null===(r=B.current)||void 0===r?void 0:r.click()}),[]),X=l((function(r){var e=String(r);G(e),K(W.current.find((function(r){return r.id===e}))),Y((function(r){return r.filter((function(r){return r.id!==e}))})),q()}),[G,K,Y,q]),Z=l((function(r){var e=String(r),n=W.current.find((function(r){return r.id===e}));null!=n&&n.file&&(G(e),_(e,{isUploading:!0,error:null}),q(),H(e,n.file))}),[G,_,H,q]),$=l((function(e){return Y((function(n){var t=new Map(n.map((function(r){return[r.id,r]}))),i=e.map((function(r){return t.get(String(r))})).filter(Boolean),u=n.filter((function(r){return!e.some((function(e){return String(e)===r.id}))}));return[].concat(r(i),r(u))}))}),[Y]),rr=l((function(){var r;W.current.forEach((function(r){G(r.id),K(r)})),Y((function(){return[]})),null===(r=T.current)||void 0===r||r.call(T,null)}),[G,Y,K]);c((function(){var r,e,n;(e=I.current,n=y,e.length===n.length&&e.every((function(r,e){return r.url===n[e].url})))||(W.current.forEach((function(r){G(r.id),r.previewUrl&&URL.revokeObjectURL(r.previewUrl)})),W.current=y.map(w),I.current=y,R(W.current),null===(r=T.current)||void 0===r||r.call(T,null))}),[y,G]);var er=u({}),nr=t(er,2),tr=nr[0],ir=nr[1],ur=o(tr);ur.current=tr;var or=E.filter((function(r){return!r.file&&!r.previewUrl&&r.uploaded})).map((function(r){return r.uploaded.name})).join("|");return c((function(){var r=or.split("|").filter((function(r){return r&&!(r in ur.current)}));if(r.length){var e=!0;return Promise.all(r.map((function(r){return p(r,"inline").then((function(e){var n=e.url;return[r,n]})).catch((function(e){return console.error('Failed to sign stored attachment "'.concat(r,'"'),e),[r,""]}))}))).then((function(r){e&&ir((function(e){return h(h({},e),Object.fromEntries(r))}))})),function(){e=!1}}}),[or]),{items:E.reduce((function(r,e){var n;if(e.file)return r.push({id:e.id,name:e.name,src:e.previewUrl,kind:b(e.file),size:e.file.size,isUploading:e.isUploading,error:null!==(n=e.error)&&void 0!==n?n:void 0}),r;var t=e.uploaded,i=f(t),u=e.previewUrl||tr[t.name];return"file"===i||u?(r.push({id:e.id,name:t.name,src:u,kind:i,size:t.size}),r):r}),[]),fileInputRef:B,openFileDialog:V,handleFileSelect:Q,addFiles:N,addLinkedImage:J,removeAttachment:X,handleRetry:Z,reorderAttachments:$,clearAttachments:rr,isUploading:E.some((function(r){return r.isUploading})),error:null!==(m=null===(g=E.find((function(r){return r.error})))||void 0===g?void 0:g.error)&&void 0!==m?m:null,count:E.length,isFull:E.length>=L,maxFiles:L}};export{g as DEFAULT_MAX_ATTACHMENTS,O as useAttachmentUpload};
2
2
  //# sourceMappingURL=useAttachmentUpload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl, getS3DownloadLink } from '~/clients/jsonApi';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const { url } = await getS3DownloadLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const kind = getFileKind(file);\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n previewUrl: kind === 'file' ? '' : URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>({});\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n .filter(entry => !entry.file && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getS3DownloadLink(name, 'inline')\n .then(({ url }: { url: string }) => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n isUploading: entry.isUploading,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n const src = storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","getFileKind","file","type","startsWith","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","previewUrl","isUploading","error","uploaded","entrySeq","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_yield$getS3DownloadL","_context2","getS3DownloadLink","abrupt","size","addFiles","_onErrorRef$current4","_ref2","_entriesRef$current$f3","_entriesRef$current$f4","supported","split","rule","trim","toLowerCase","some","endsWith","slice","getAttachmentKind","isAcceptedType","unsupported","length","tooMany","room","_onErrorRef$current3","accepted","added","kind","isTooLarge","concat","createObjectURL","overflow","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current5","_onErrorRef$current6","a","b","every","index","_useState3","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","Promise","all","then","_ref3","catch","console","resolved","_objectSpread","Object","fromEntries","items","reduce","acc","_entry$error","push","src","undefined","stored","count","isFull"],"mappings":"irCAwCO,IAAMA,EAA0B,GAoBjCC,EAAc,SAACC,GACnB,OAAIA,EAAKC,KAAKC,WAAW,UAAkB,QACvCF,EAAKC,KAAKC,WAAW,UAAkB,QACpC,MACT,EAEMC,EAAW,SAACC,GAAa,OAAMA,EAAK,SAAkBC,QAAQ,EAAE,EAQhEC,EAAgB,SAACC,GAA8B,MAAa,CAChEC,GAAID,EAAWE,IACfC,KAAMH,EAAWG,KACjBV,KAAM,KACNW,WAAY,GACZC,aAAa,EACbC,MAAO,KACPC,SAAUP,EACX,EAEGQ,EAAW,EAMFC,EAAsB,SAODC,GAAA,IAAAC,EAAAC,EANhCC,IAAAA,MACAC,IAAAA,SACAC,IAAAA,QACAC,IAAAA,aAAYC,EAAAP,EACZQ,SAAAA,aAvDqC,GAuDHD,EAAAE,EAAAT,EAClCU,OAAAA,aAASC,EAAyBF,EAEJG,EAAAA,EAAkB,IAAGC,EAAAC,EAAAC,EAAA,GAA5CC,EAAOH,EAAA,GAAEI,EAAUJ,EAAA,GAEpBK,EAAeC,EAAyB,MACxCC,EAAeD,EAAO,IAAIE,KAE1BC,EAAcH,EAAO,IAAIE,KAEzBE,EAAaJ,EAAgB,IAC7BK,EAAcL,EAAOf,GACrBqB,EAAaN,EAAOd,GAE1BmB,EAAYE,QAAUtB,EACtBqB,EAAWC,QAAUrB,EAIrB,IAAMsB,EAAaR,EAA6B,IAE1CS,EAASC,GAAY,SAACC,GAC1B,IAAMC,EAAOD,EAAQP,EAAWG,SAChCH,EAAWG,QAAUK,EACrBd,EAAWc,GACXJ,EAAWD,QApDK,SAACV,GAAgB,OACnCA,EAAQgB,KAAI,SAAAC,GAAK,OAAIA,EAAMpC,QAAQ,IAAEqC,OAAOC,QAAQ,CAmD7BC,CAAYL,GACjCP,EAAYE,QAAQC,EAAWD,QAChC,GAAE,IAEGW,EAAaR,GACjB,SAACtC,EAAY+C,GAAqB,OAChCV,GAAO,SAAAW,GAAI,OAAIA,EAAKP,KAAI,SAAAC,GAAK,OAAKA,EAAM1C,KAAOA,SAAU0C,GAAUK,GAAUL,CAAK,SACpF,CAACL,IAGGY,EAAcX,GAAY,SAACtC,GAAe,IAAAkD,EAAAC,EAClB,QAA5BtB,EAAAA,EAAaM,QAAQiB,IAAIpD,UAAG,IAAAkD,GAA5BA,EAA8BD,cAC9BpB,EAAaM,QAAQkB,OAAOrD,GAG5B+B,EAAYI,QAAQmB,IAAItD,aAAK+B,EAAYI,QAAQiB,IAAIpD,kBAAO,GAAK,EAClE,GAAE,IAEGuD,EAAiBjB,GAAY,SAACI,GAC9BA,SAAAA,EAAOvC,YAAYqD,IAAIC,gBAAgBf,EAAMvC,WAClD,GAAE,IAIGuD,EAAYpB,GAAY,WAAM,IAAAqB,EAAAC,EAAAC,EAChB,QAAlBF,EAAAzB,EAAWC,eAAO,IAAAwB,GAAlBA,OAAAzB,EAAyE,QAA/D0B,EAAW,QAAXC,EAAW7B,EAAWG,QAAQ2B,MAAK,SAAApB,GAAK,OAAIA,EAAMrC,KAAK,WAA5C,IAAAwD,OAAA,EAAAA,EAA+CxD,aAAK,IAAAuD,EAAAA,EAAI,KAC9E,GAAE,IAEHG,GACE,WAAA,OAAM,WACJlC,EAAaM,QAAQ6B,SAAQ,SAAAC,GAAQ,OAAIA,EAAShB,iBAClDpB,EAAaM,QAAQ+B,QACrBlC,EAAWG,QAAQ6B,SAAQ,SAAAtB,GACrBA,EAAMvC,YAAYqD,IAAIC,gBAAgBf,EAAMvC,WAClD,IACD,GACD,IAGF,IAAMgE,EAAc7B,GAClB,SAACtC,EAAYR,GAAe,IAAA4E,EACpBC,GAA0C,QAA/BtC,EAAAA,EAAYI,QAAQiB,IAAIpD,UAAO,IAAAoE,EAAAA,EAAA,GAAK,EACrDrC,EAAYI,QAAQmB,IAAItD,EAAIqE,GAE5B,IA0BiBC,EAZDC,EAdVC,EAAY,WAAH,OAASzC,EAAYI,QAAQiB,IAAIpD,KAAQqE,CAAO,EAEzDI,EAAO,SAACC,GAAoB,IAAAC,EAC3BH,MACL1B,EAAW9C,EAAI,CAAEI,aAAa,EAAOC,MAAOqE,IAC1B,QAAlBxC,EAAAA,EAAWC,eAAO,IAAAwC,GAAlBA,OAAAzC,EAAqBwC,KAGnBE,EAAY,GAEVX,EAAW,IAAIY,EAAS,CAC5BC,MAAO,CAACtF,GACRuF,WAAY,SAACC,EAAcxC,GAA0B,OAAKA,EAAKwC,EAAO,EACtEC,WAAY,WAAQ,EACpBC,cAAcX,EAAAY,EAAAC,EAAAC,MAAA,SAAAC,EACZN,EACAO,GAAuE,IAAAC,EAAA,OAAAJ,EAAAK,MAAA,SAAAC,GAAA,OAAA,OAAAA,EAAA1C,KAAA0C,EAAAlD,MAAA,KAAA,EAAA,OAAAkD,EAAA1C,KAAA,EAAA0C,EAAAlD,KAAA,EAGlDmD,EAAeX,EAAO9E,KAAM8E,EAAOvF,MAAK,KAAA,EAArDmG,EAAIF,EAAAG,KACVjB,EAAYgB,EAAKE,UACjBP,SAAcK,GAAI,CAAA,EAAA,CAAEG,UAAWH,EAAKI,cAAcN,EAAAlD,KAAA,GAAA,MAAA,KAAA,EAAAkD,EAAA1C,KAAA,EAAA0C,EAAAO,GAAAP,EAAA,MAAA,GAElDjB,GAAK,OAAAiB,EAAAO,SAAA,IAAAP,EAAAO,QAAA,EAAAP,EAAAO,GAAcvB,UAAW,6BAA6B,KAAA,GAAA,IAAA,MAAA,OAAAgB,EAAAQ,OAAA,GAAAZ,EAAA,KAAA,CAAA,CAAA,EAAA,IAE9D,KAAA,SAAAa,EAAAC,GAAA,OAAA7B,EAAA8B,MAAAC,KAAAC,UAAA,GACDC,eAAelC,EAAAa,EAAAC,EAAAC,MAAA,SAAAoB,IAAA,IAAAC,EAAAzG,EAAA,OAAAmF,EAAAK,MAAA,SAAAkB,GAAA,OAAA,OAAAA,EAAA3D,KAAA2D,EAAAnE,MAAA,KAAA,EAAA,OAAAmE,EAAA3D,KAAA,EAAA2D,EAAAnE,KAAA,EAEWoE,EAAkBhC,GAAU,KAAA,EAAvC,GAAuC8B,EAAAC,EAAAd,KAA1C5F,IAAAA,IACHuE,IAAW,CAAAmC,EAAAnE,KAAA,EAAA,KAAA,CAAA,OAAAmE,EAAAE,OAAA,UAAA,KAAA,EAEhBhF,EAAaM,QAAQkB,OAAOrD,GAC5B8C,EAAW9C,EAAI,CACbI,aAAa,EACbC,MAAO,KACPC,SAAU,CAAEL,IAAAA,EAAKC,KAAM0E,EAAWkC,KAAMtH,EAAKsH,QAE/CpD,IAAYiD,EAAAnE,KAAA,GAAA,MAAA,KAAA,GAAAmE,EAAA3D,KAAA,GAAA2D,EAAAV,GAAAU,EAAA,MAAA,GAEZlC,GAAK,OAAAkC,EAAAV,SAAA,IAAAU,EAAAV,QAAA,EAAAU,EAAAV,GAAcvB,UAAW,6BAA6B,KAAA,GAAA,IAAA,MAAA,OAAAiC,EAAAT,OAAA,GAAAO,EAAA,KAAA,CAAA,CAAA,EAAA,KAE9D,KAAA,WAAA,OAAAnC,EAAA+B,MAAAC,KAAAC,UAAA,GACDzF,QAAS,SAAC4D,GAAe,OAAKD,EAAKC,GAAW,4BAA4B,IAG5E7C,EAAaM,QAAQmB,IAAItD,EAAIiE,EAC/B,GACA,CAACnB,EAAYY,IAGTqD,EAAWzE,GACf,SAACwC,GAAkB,IAAAkC,EAAAC,EAAAC,EAAAC,EACXC,EAAYtC,EAAMnC,QAAO,SAAAnD,GAAI,OA7KlB,SAACA,EAAY2B,GAAc,OAChDA,EACGkG,MAAM,KACN5E,KAAI,SAAA6E,GAAI,OAAIA,EAAKC,OAAOC,aAAc,IACtC7E,OAAOC,SACP6E,MAAK,SAAAH,GACJ,GAAIA,EAAK5H,WAAW,KAAM,OAAOF,EAAKU,KAAKsH,cAAcE,SAASJ,GAClE,GAAIA,EAAKI,SAAS,MAAO,CACvB,IAAMjI,EAAOD,EAAKC,KAAK+H,cACvB,OAAI/H,EAAaA,EAAKC,WAAW4H,EAAKK,MAAM,GAAI,IAEzCC,EAAkB,CAAE1H,KAAMV,EAAKU,SAAYoH,EAAKK,MAAM,GAAI,EACnE,CAEA,OAAOnI,EAAKC,KAAK+H,gBAAkBF,CACrC,GAAE,CA8JuCO,CAAerI,EAAM2B,MAItD2G,EAHUV,EAAUW,OAASjD,EAAMiD,OAInB,IAAjBjD,EAAMiD,OAAgB,mCACvB,mDACA,KACEC,EAAkC/G,wBAAAA,OAAAA,EAAiB,WAEnDgH,EAAOhH,EAAWe,EAAWG,QAAQ4F,OAC3C,IAAKX,EAAUW,QAAUE,GAAQ,EAAjC,CAAoC,IAAAC,EAChB,QAAlBA,EAAAhG,EAAWC,eAAO,IAAA+F,GAAlBA,OAAAhG,EAAqBkF,EAAUW,OAASC,EAAUF,EAEpD,KAHA,CAKA,IAAMK,EAAWf,EAAUO,MAAM,EAAGM,GAC9BG,EAAiBD,EAAS1F,KAAI,SAAAjD,GAClC,IAAM6I,EAAO9I,EAAYC,GACnB8I,IAAevH,GAAgBvB,EAAKsH,KAAO/F,EAEjD,MAAO,CACLf,GAvJR,cAAAuI,OADAhI,GAAY,GAyJJL,KAAMV,EAAKU,KACXV,KAAAA,EACAW,WAAqB,SAATkI,EAAkB,GAAK7E,IAAIgF,gBAAgBhJ,GACvDY,aAAckI,EACdjI,MAAOiI,EACmB3I,sBAAAA,OAAAA,EAASH,EAAKsH,uCAA8BnH,EAChEoB,WAEF,KACJT,SAAU,KAEd,IAEA+B,GAAO,SAAAW,GAAI,MAAQA,GAAAA,OAAAA,EAAAA,KAASoF,GAAK,IAEjC,IAAMK,EAAWrB,EAAUW,OAASI,EAASJ,OAASC,EAAU,KAC9C,QAAlBhB,EAAA9E,EAAWC,eAAO,IAAA6E,GAAlBA,OAAA9E,EACqE,QAD3D+E,UAAAC,UAAAC,EACRnF,EAAWG,QAAQ2B,MAAK,SAAApB,GAAK,OAAIA,EAAMrC,KAAK,wBAA5C8G,EAA+C9G,qBAASyH,SAAW,IAAAb,EAAAA,EAAIwB,GAGzEL,EACGzF,QAAO,SAAAD,GAAK,OAAKA,EAAMrC,KAAK,IAC5B2D,SAAQ,SAAAtB,GAAK,OAAIyB,EAAYzB,EAAM1C,GAAI0C,EAAMlD,QA/BhD,CAgCF,GACA,CAAC6C,EAAQpB,EAAUF,EAAcoD,EAAahD,IAG1CuH,EAAmBpG,GACvB,SAACqG,GAAyC,IAAAC,EAClC9D,EAAQ+D,MAAMC,KAAuB,QAAnBF,EAACD,EAAM3D,OAAOF,aAAK,IAAA8D,EAAAA,EAAI,IAE3CjH,EAAaQ,UAASR,EAAaQ,QAAQvB,MAAQ,IACnDkE,EAAMiD,QAAQhB,EAASjC,EAC7B,GACA,CAACiC,IAGGgC,EAAiBzG,GAAY,WAAA,IAAA0G,EAAA,OAAM,QAANA,EAAMrH,EAAaQ,eAAb,IAAA6G,OAAA,EAAAA,EAAsBC,OAAO,GAAE,IAElEC,EAAmB5G,GACvB,SAACtC,GACC,IAAMmJ,EAAMC,OAAOpJ,GACnBiD,EAAYkG,GACZ5F,EAAevB,EAAWG,QAAQ2B,MAAK,SAAApB,GAAK,OAAIA,EAAM1C,KAAOmJ,CAAG,KAChE9G,GAAO,SAAAW,GAAI,OAAIA,EAAKL,QAAO,SAAAD,GAAK,OAAIA,EAAM1C,KAAOmJ,QACjDzF,GACD,GACD,CAACT,EAAaM,EAAgBlB,EAAQqB,IAGlC2F,EAAc/G,GAClB,SAACtC,GACC,IAAMmJ,EAAMC,OAAOpJ,GACb0C,EAAQV,EAAWG,QAAQ2B,MAAK,SAAAwF,GAAI,OAAIA,EAAKtJ,KAAOmJ,KACrDzG,SAAAA,EAAOlD,OAEZyD,EAAYkG,GACZrG,EAAWqG,EAAK,CAAE/I,aAAa,EAAMC,MAAO,OAC5CqD,IACAS,EAAYgF,EAAKzG,EAAMlD,MACxB,GACD,CAACyD,EAAaH,EAAYqB,EAAaT,IAGnC6F,EAAqBjH,GACzB,SAACkH,GAAyC,OACxCnH,GAAO,SAAAW,GACL,IAAMyG,EAAO,IAAI3H,IAAIkB,EAAKP,KAAI,SAAAC,GAAK,MAAI,CAACA,EAAM1C,GAAI0C,EAAM,KAClDgH,EAAYF,EAAW/G,KAAI,SAAAzC,GAAE,OAAIyJ,EAAKrG,IAAIgG,OAAOpJ,GAAI,IAAE2C,OAAOC,SAE9D+G,EAAU3G,EAAKL,QAAO,SAAAD,GAAK,OAAK8G,EAAW/B,MAAK,SAAAzH,GAAE,OAAIoJ,OAAOpJ,KAAQ0C,EAAM1C,SACjF,MAAW0J,GAAAA,OAAAA,EAAAA,KAAcC,GAC3B,MACF,CAACtH,IAGGuH,EAAmBtH,GAAY,WAAM,IAAAuH,EACzC7H,EAAWG,QAAQ6B,SAAQ,SAAAtB,GACzBO,EAAYP,EAAM1C,IAClBuD,EAAeb,EACjB,IACAL,GAAO,WAAA,MAAM,MACK,QAAlBH,EAAAA,EAAWC,eAAO,IAAA0H,GAAlBA,OAAA3H,EAAqB,KACtB,GAAE,CAACe,EAAaZ,EAAQkB,IAMzBQ,GAAU,WAAM,IAAA+F,EAjQEC,EAAyBC,GAAzBD,EAkQD3H,EAAWD,QAlQe6H,EAkQNpJ,EAjQrCmJ,EAAEhC,SAAWiC,EAAEjC,QAAUgC,EAAEE,OAAM,SAACX,EAAMY,GAAK,OAAKZ,EAAKrJ,MAAQ+J,EAAEE,GAAOjK,UAmQtE+B,EAAWG,QAAQ6B,SAAQ,SAAAtB,GACzBO,EAAYP,EAAM1C,IACd0C,EAAMvC,YAAYqD,IAAIC,gBAAgBf,EAAMvC,WAClD,IACA6B,EAAWG,QAAUvB,EAAM6B,IAAI3C,GAC/BsC,EAAWD,QAAUvB,EACrBc,EAAWM,EAAWG,SACJ,QAAlBD,EAAAA,EAAWC,eAAO,IAAA2H,GAAlBA,OAAA5H,EAAqB,MACvB,GAAG,CAACtB,EAAOqC,IAGX,IAAAkH,EAAoC9I,EAAiC,IAAG+I,GAAA7I,EAAA4I,EAAA,GAAjEE,GAAUD,GAAA,GAAEE,GAAaF,GAAA,GAC1BG,GAAgB3I,EAAOyI,IAC7BE,GAAcpI,QAAUkI,GAExB,IAAMG,GAAc/I,EACjBkB,QAAO,SAAAD,GAAK,OAAKA,EAAMlD,MAAQkD,EAAMpC,QAAQ,IAC7CmC,KAAI,SAAAC,GAAK,OAAKA,EAAMpC,SAAgCJ,IAAI,IACxDuK,KAAK,KAiDR,OA/CA1G,GAAU,WACR,IAAM2G,EAAUF,GAAYnD,MAAM,KAAK1E,QAAO,SAAAzC,GAAI,OAAIA,KAAUA,KAAQqK,GAAcpI,YACtF,GAAKuI,EAAQ3C,OAAb,CAEA,IAAI4C,GAAW,EAef,OAdAC,QAAQC,IACNH,EAAQjI,KAAI,SAAAvC,GAAI,OACd0G,EAAkB1G,EAAM,UACrB4K,MAAK,SAAAC,GAAA,IAAG9K,IAAAA,IAAG,MAAwB,CAACC,EAAMD,EAAI,IAC9C+K,OAAM,SAAA3K,GAGL,OAFA4K,QAAQ5K,MAAK,qCAAAkI,OAAsCrI,EAAI,KAAKG,GAErD,CAACH,EAAM,GAChB,GAAE,KAEN4K,MAAK,SAAAI,GACDP,GAAUL,IAAc,SAAAtH,GAAI,OAAAmI,EAAAA,EAAA,GAAUnI,GAASoI,OAAOC,YAAYH,GAAS,GACjF,IAEO,WACLP,GAAW,EAlBwB,CAoBvC,GAAG,CAACH,KAyBG,CACLc,MAxBY7J,EAAQ8J,QAAgC,SAACC,EAAK9I,GAC1C,IAAA+I,EAAhB,GAAI/I,EAAMlD,KASR,OARAgM,EAAIE,KAAK,CACP1L,GAAI0C,EAAM1C,GACVE,KAAMwC,EAAMxC,KACZyL,IAAKjJ,EAAMvC,WACXkI,KAAM9I,EAAYmD,EAAMlD,MACxBY,YAAasC,EAAMtC,YACnBC,MAAsBuL,QAAflJ,EAAAA,EAAMrC,aAASuL,IAAAA,EAAAA,OAAAA,IAEjBJ,EAGT,IAAMK,EAASnJ,EAAMpC,SACf+H,EAAOT,EAAkBiE,GACzBF,EAAMtB,GAAWwB,EAAO3L,MAE9B,MAAa,SAATmI,GAAoBsD,GAExBH,EAAIE,KAAK,CAAE1L,GAAI0C,EAAM1C,GAAIE,KAAM2L,EAAO3L,KAAMyL,IAAAA,EAAKtD,KAAAA,IAC1CmD,GAH6BA,CAIrC,GAAE,IAID7J,aAAAA,EACAoH,eAAAA,EACAL,iBAAAA,EACA3B,SAAAA,EACAmC,iBAAAA,EACAG,YAAAA,EACAE,mBAAAA,EACAK,iBAAAA,EACAxJ,YAAaqB,EAAQgG,MAAK,SAAA/E,GAAK,OAAIA,EAAMtC,eACzCC,MAAgD,UAAzC,UAAAoB,EAAQqC,MAAK,SAAApB,GAAK,OAAIA,EAAMrC,KAAK,WAAjC,IAAAM,OAAA,EAAAA,EAAoCN,aAAK,IAAAK,EAAAA,EAAI,KACpDoL,MAAOrK,EAAQsG,OACfgE,OAAQtK,EAAQsG,QAAU9G,EAC1BA,SAAAA,EAEJ"}
1
+ {"version":3,"file":"useAttachmentUpload.js","sources":["../../../src/components/CommentComposer/useAttachmentUpload.ts"],"sourcesContent":["import { ChangeEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport S3Upload from 'react-s3-uploader/s3upload';\n\nimport type {\n AttachmentKind,\n AttachmentPreviewItem,\n} from '../AttachmentPreview/AttachmentPreview.types';\nimport { getAttachmentKind } from '../AttachmentPreview/getAttachmentKind';\nimport { ACCEPTED_ATTACHMENT_TYPES } from '../AttachFileButton';\n\nimport { getS3SignedUrl, getS3DownloadLink } from '~/clients/jsonApi';\nimport { getUrlFileName } from '~/utils/links';\n\nexport type UploadedAttachment = {\n url: string;\n name: string;\n size?: number;\n};\n\ntype UseAttachmentUploadOptions = {\n value: UploadedAttachment[];\n onChange: (attachments: UploadedAttachment[]) => void;\n onError?: (message: string | null) => void;\n maxSizeBytes?: number;\n maxFiles?: number;\n /** Mirrors the file input's `accept`; also gates drag-and-drop. */\n accept?: string;\n};\n\n/** A picked or already-stored file, in the order the user arranged it. */\ntype Entry = {\n id: string;\n name: string;\n /** Set while the file is local; cleared entries come from `value`. */\n file: File | null;\n previewUrl: string;\n isUploading: boolean;\n error: string | null;\n uploaded: UploadedAttachment | null;\n};\n\nexport const DEFAULT_MAX_ATTACHMENTS = 10;\n\n/** Same rules the file input enforces via `accept`, so drag-and-drop can't smuggle a type past it. */\nconst isAcceptedType = (file: File, accept: string) =>\n accept\n .split(',')\n .map(rule => rule.trim().toLowerCase())\n .filter(Boolean)\n .some(rule => {\n if (rule.startsWith('.')) return file.name.toLowerCase().endsWith(rule);\n if (rule.endsWith('/*')) {\n const type = file.type.toLowerCase();\n if (type) return type.startsWith(rule.slice(0, -1));\n\n return getAttachmentKind({ name: file.name }) === rule.slice(0, -1);\n }\n\n return file.type.toLowerCase() === rule;\n });\n\nconst getFileKind = (file: File): AttachmentKind => {\n if (file.type.startsWith('image/')) return 'image';\n if (file.type.startsWith('video/')) return 'video';\n return 'file';\n};\n\nconst formatMb = (bytes: number) => (bytes / (1024 * 1024)).toFixed(1);\n\nconst getUploaded = (entries: Entry[]) =>\n entries.map(entry => entry.uploaded).filter(Boolean) as UploadedAttachment[];\n\nconst isSameList = (a: UploadedAttachment[], b: UploadedAttachment[]) =>\n a.length === b.length && a.every((item, index) => item.url === b[index].url);\n\nconst toStoredEntry = (attachment: UploadedAttachment): Entry => ({\n id: attachment.url,\n name: attachment.name,\n file: null,\n previewUrl: '',\n isUploading: false,\n error: null,\n uploaded: attachment,\n});\n\nlet entrySeq = 0;\nconst nextEntryId = () => {\n entrySeq += 1;\n return `attachment-${entrySeq}`;\n};\n\nexport const useAttachmentUpload = ({\n value,\n onChange,\n onError,\n maxSizeBytes,\n maxFiles = DEFAULT_MAX_ATTACHMENTS,\n accept = ACCEPTED_ATTACHMENT_TYPES,\n}: UseAttachmentUploadOptions) => {\n const [entries, setEntries] = useState<Entry[]>([]);\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n const uploadersRef = useRef(new Map<string, S3Upload>());\n // Bumped per attempt so a superseded upload can't write state for a restarted entry.\n const sessionsRef = useRef(new Map<string, number>());\n // Mutations are driven from async upload callbacks, so the latest list lives in a ref.\n const entriesRef = useRef<Entry[]>([]);\n const onChangeRef = useRef(onChange);\n const onErrorRef = useRef(onError);\n\n onChangeRef.current = onChange;\n onErrorRef.current = onError;\n\n // What we last handed the parent. A `value` that still matches it is our own change echoing\n // back; anything else is a parent-driven reset we must adopt.\n const emittedRef = useRef<UploadedAttachment[]>([]);\n\n const commit = useCallback((updater: (prev: Entry[]) => Entry[]) => {\n const next = updater(entriesRef.current);\n entriesRef.current = next;\n setEntries(next);\n emittedRef.current = getUploaded(next);\n onChangeRef.current(emittedRef.current);\n }, []);\n\n const patchEntry = useCallback(\n (id: string, patch: Partial<Entry>) =>\n commit(prev => prev.map(entry => (entry.id === id ? { ...entry, ...patch } : entry))),\n [commit]\n );\n\n const abortUpload = useCallback((id: string) => {\n uploadersRef.current.get(id)?.abortUpload();\n uploadersRef.current.delete(id);\n // Bump, never delete: deleting would let the next attempt reuse session 1, so a callback\n // still in flight from the aborted attempt would pass `isCurrent` and clobber it.\n sessionsRef.current.set(id, (sessionsRef.current.get(id) ?? 0) + 1);\n }, []);\n\n const releasePreview = useCallback((entry?: Entry) => {\n if (entry?.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n }, []);\n\n // The banner is shared by every tile, so recompute it rather than clear it — one file\n // succeeding must not hide a sibling that is still failing.\n const syncError = useCallback(() => {\n onErrorRef.current?.(entriesRef.current.find(entry => entry.error)?.error ?? null);\n }, []);\n\n useEffect(\n () => () => {\n uploadersRef.current.forEach(uploader => uploader.abortUpload());\n uploadersRef.current.clear();\n entriesRef.current.forEach(entry => {\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n },\n []\n );\n\n const startUpload = useCallback(\n (id: string, file: File) => {\n const session = (sessionsRef.current.get(id) ?? 0) + 1;\n sessionsRef.current.set(id, session);\n // A superseded upload must not write state for an entry that is gone or restarted.\n const isCurrent = () => sessionsRef.current.get(id) === session;\n\n const fail = (message: string) => {\n if (!isCurrent()) return;\n patchEntry(id, { isUploading: false, error: message });\n onErrorRef.current?.(message);\n };\n\n let storedKey = '';\n\n const uploader = new S3Upload({\n files: [file],\n preprocess: (target: File, next: (file: File) => void) => next(target),\n onProgress: () => {},\n getSignedUrl: async (\n target: File,\n callback: (data: { signedUrl: string; [key: string]: unknown }) => void\n ) => {\n try {\n const data = await getS3SignedUrl(target.name, target.type);\n storedKey = data.file_name;\n callback({ ...data, signedUrl: data.signed_url });\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onFinishS3Put: async () => {\n try {\n const { url } = await getS3DownloadLink(storedKey);\n if (!isCurrent()) return;\n\n uploadersRef.current.delete(id);\n patchEntry(id, {\n isUploading: false,\n error: null,\n uploaded: { url, name: storedKey, size: file.size },\n });\n syncError();\n } catch (e) {\n fail((e as Error)?.message || 'Failed to upload the file');\n }\n },\n onError: (message: string) => fail(message || 'Failed to upload the file'),\n });\n\n uploadersRef.current.set(id, uploader);\n },\n [patchEntry, syncError]\n );\n\n /** Nothing is uploaded: a comment attachment is a url, so the link itself is the attachment. */\n const addLinkedImage = useCallback(\n (url: string) => {\n const name = getUrlFileName(url);\n\n if (!name) return;\n if (entriesRef.current.length >= maxFiles) {\n onErrorRef.current?.(`You can attach up to ${maxFiles} files.`);\n\n return;\n }\n\n if (entriesRef.current.some(entry => entry.uploaded?.url === url)) return;\n\n commit(prev => [\n ...prev,\n {\n id: nextEntryId(),\n name,\n file: null,\n previewUrl: url,\n isUploading: false,\n error: null,\n uploaded: { url, name },\n },\n ]);\n },\n [commit, maxFiles]\n );\n\n const addFiles = useCallback(\n (files: File[]) => {\n const supported = files.filter(file => isAcceptedType(file, accept));\n const skipped = supported.length < files.length;\n // One banner, one message: report the most actionable reason once, at the end. Reporting\n // as we go would let a later call overwrite an earlier warning on a mixed drop.\n const unsupported = skipped\n ? (files.length === 1 && 'That file type is not supported.') ||\n 'Some files were skipped — unsupported file type.'\n : null;\n const tooMany = `You can attach up to ${maxFiles} files.`;\n\n const room = maxFiles - entriesRef.current.length;\n if (!supported.length || room <= 0) {\n onErrorRef.current?.(supported.length ? tooMany : unsupported);\n return;\n }\n\n const accepted = supported.slice(0, room);\n const added: Entry[] = accepted.map(file => {\n const kind = getFileKind(file);\n const isTooLarge = !!maxSizeBytes && file.size > maxSizeBytes;\n\n return {\n id: nextEntryId(),\n name: file.name,\n file,\n previewUrl: kind === 'file' ? '' : URL.createObjectURL(file),\n isUploading: !isTooLarge,\n error: isTooLarge\n ? `File is too large (${formatMb(file.size)} MB). Maximum size is ${formatMb(\n maxSizeBytes as number\n )} MB.`\n : null,\n uploaded: null,\n };\n });\n\n commit(prev => [...prev, ...added]);\n\n const overflow = supported.length > accepted.length ? tooMany : null;\n onErrorRef.current?.(\n entriesRef.current.find(entry => entry.error)?.error ?? unsupported ?? overflow\n );\n\n added\n .filter(entry => !entry.error)\n .forEach(entry => startUpload(entry.id, entry.file as File));\n },\n [commit, maxFiles, maxSizeBytes, startUpload, accept]\n );\n\n const handleFileSelect = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n const files = Array.from(event.target.files ?? []);\n // Reset the input so re-picking the same file still fires a change event.\n if (fileInputRef.current) fileInputRef.current.value = '';\n if (files.length) addFiles(files);\n },\n [addFiles]\n );\n\n const openFileDialog = useCallback(() => fileInputRef.current?.click(), []);\n\n const removeAttachment = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n abortUpload(key);\n releasePreview(entriesRef.current.find(entry => entry.id === key));\n commit(prev => prev.filter(entry => entry.id !== key));\n syncError();\n },\n [abortUpload, releasePreview, commit, syncError]\n );\n\n const handleRetry = useCallback(\n (id: AttachmentPreviewItem['id']) => {\n const key = String(id);\n const entry = entriesRef.current.find(item => item.id === key);\n if (!entry?.file) return;\n\n abortUpload(key);\n patchEntry(key, { isUploading: true, error: null });\n syncError();\n startUpload(key, entry.file);\n },\n [abortUpload, patchEntry, startUpload, syncError]\n );\n\n const reorderAttachments = useCallback(\n (orderedIds: AttachmentPreviewItem['id'][]) =>\n commit(prev => {\n const byId = new Map(prev.map(entry => [entry.id, entry]));\n const reordered = orderedIds.map(id => byId.get(String(id))).filter(Boolean) as Entry[];\n // Unlisted ids (a race with a removal) keep their place at the end.\n const missing = prev.filter(entry => !orderedIds.some(id => String(id) === entry.id));\n return [...reordered, ...missing];\n }),\n [commit]\n );\n\n const clearAttachments = useCallback(() => {\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n releasePreview(entry);\n });\n commit(() => []);\n onErrorRef.current?.(null);\n }, [abortUpload, commit, releasePreview]);\n\n // Adopt a value we didn't produce — an edit form's initial attachments, or a parent-side reset.\n // Compared against what we emitted, not against the current entries: a failed-only or\n // mid-upload list emits `[]` too, and treating that as \"in sync\" would strand those tiles\n // on screen and let a late upload write itself back into freshly reset parent state.\n useEffect(() => {\n if (isSameList(emittedRef.current, value)) return;\n\n entriesRef.current.forEach(entry => {\n abortUpload(entry.id);\n if (entry.previewUrl) URL.revokeObjectURL(entry.previewUrl);\n });\n entriesRef.current = value.map(toStoredEntry);\n emittedRef.current = value;\n setEntries(entriesRef.current);\n onErrorRef.current?.(null);\n }, [value, abortUpload]);\n\n // A stored url has expired by now, so re-sign it for the preview.\n const [storedSrcs, setStoredSrcs] = useState<Record<string, string>>({});\n const storedSrcsRef = useRef(storedSrcs);\n storedSrcsRef.current = storedSrcs;\n\n const storedNames = entries\n // A linked image carries its own url, so there is no key of ours to sign.\n .filter(entry => !entry.file && !entry.previewUrl && entry.uploaded)\n .map(entry => (entry.uploaded as UploadedAttachment).name)\n .join('|');\n\n useEffect(() => {\n const pending = storedNames.split('|').filter(name => name && !(name in storedSrcsRef.current));\n if (!pending.length) return undefined;\n\n let isActive = true;\n Promise.all(\n pending.map(name =>\n getS3DownloadLink(name, 'inline')\n .then(({ url }: { url: string }) => [name, url] as const)\n .catch(error => {\n console.error(`Failed to sign stored attachment \"${name}\"`, error);\n\n return [name, ''] as const;\n })\n )\n ).then(resolved => {\n if (isActive) setStoredSrcs(prev => ({ ...prev, ...Object.fromEntries(resolved) }));\n });\n\n return () => {\n isActive = false;\n };\n }, [storedNames]);\n\n const items = entries.reduce<AttachmentPreviewItem[]>((acc, entry) => {\n if (entry.file) {\n acc.push({\n id: entry.id,\n name: entry.name,\n src: entry.previewUrl,\n kind: getFileKind(entry.file),\n size: entry.file.size,\n isUploading: entry.isUploading,\n error: entry.error ?? undefined,\n });\n return acc;\n }\n\n const stored = entry.uploaded as UploadedAttachment;\n const kind = getAttachmentKind(stored);\n // A linked image is already a url; only one of ours has an S3 key worth signing.\n const src = entry.previewUrl || storedSrcs[stored.name];\n // A thumbnail without its signed url would paint as a broken image, so hold it back.\n if (kind !== 'file' && !src) return acc;\n\n acc.push({ id: entry.id, name: stored.name, src, kind, size: stored.size });\n return acc;\n }, []);\n\n return {\n items,\n fileInputRef,\n openFileDialog,\n handleFileSelect,\n addFiles,\n addLinkedImage,\n removeAttachment,\n handleRetry,\n reorderAttachments,\n clearAttachments,\n isUploading: entries.some(entry => entry.isUploading),\n error: entries.find(entry => entry.error)?.error ?? null,\n count: entries.length,\n isFull: entries.length >= maxFiles,\n maxFiles,\n };\n};\n"],"names":["DEFAULT_MAX_ATTACHMENTS","getFileKind","file","type","startsWith","formatMb","bytes","toFixed","toStoredEntry","attachment","id","url","name","previewUrl","isUploading","error","uploaded","entrySeq","nextEntryId","concat","useAttachmentUpload","_ref","_entries$find$error","_entries$find","value","onChange","onError","maxSizeBytes","_ref$maxFiles","maxFiles","_ref$accept","accept","ACCEPTED_ATTACHMENT_TYPES","useState","_useState2","_slicedToArray","_useState","entries","setEntries","fileInputRef","useRef","uploadersRef","Map","sessionsRef","entriesRef","onChangeRef","onErrorRef","current","emittedRef","commit","useCallback","updater","next","map","entry","filter","Boolean","getUploaded","patchEntry","patch","prev","abortUpload","_uploadersRef$current","_sessionsRef$current$","get","delete","set","releasePreview","URL","revokeObjectURL","syncError","_onErrorRef$current","_entriesRef$current$f","_entriesRef$current$f2","find","useEffect","forEach","uploader","clear","startUpload","_sessionsRef$current$2","session","_onFinishS3Put","_getSignedUrl","isCurrent","fail","message","_onErrorRef$current2","storedKey","S3Upload","files","preprocess","target","onProgress","getSignedUrl","_asyncToGenerator","_regeneratorRuntime","mark","_callee","callback","_data","wrap","_context","getS3SignedUrl","data","sent","file_name","signedUrl","signed_url","t0","stop","_x","_x2","apply","this","arguments","onFinishS3Put","_callee2","_yield$getS3DownloadL","_context2","getS3DownloadLink","abrupt","size","addLinkedImage","_onErrorRef$current3","getUrlFileName","length","some","_entry$uploaded","_toConsumableArray","addFiles","_onErrorRef$current5","_ref2","_entriesRef$current$f3","_entriesRef$current$f4","supported","split","rule","trim","toLowerCase","endsWith","slice","getAttachmentKind","isAcceptedType","unsupported","tooMany","room","_onErrorRef$current4","accepted","added","kind","isTooLarge","createObjectURL","overflow","handleFileSelect","event","_event$target$files","Array","from","openFileDialog","_fileInputRef$current","click","removeAttachment","key","String","handleRetry","item","reorderAttachments","orderedIds","byId","reordered","missing","clearAttachments","_onErrorRef$current6","_onErrorRef$current7","a","b","every","index","_useState3","_useState4","storedSrcs","setStoredSrcs","storedSrcsRef","storedNames","join","pending","isActive","Promise","all","then","_ref3","catch","console","resolved","_objectSpread","Object","fromEntries","items","reduce","acc","_entry$error","push","src","undefined","stored","count","isFull"],"mappings":"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"}
@@ -26,6 +26,8 @@ export type CommentInputProps = {
26
26
  onAttachmentReorder?: (orderedIds: AttachmentPreviewItem['id'][]) => void;
27
27
  /** Enables dropping files from the desktop onto the composer. */
28
28
  onFilesDrop?: (files: File[]) => void;
29
+ /** Given a pasted link that points at an image. */
30
+ onImageLinkPaste?: (url: string) => void;
29
31
  dropLabel?: string;
30
32
  /** Extra content in the attachment area, e.g. an upload-error banner. */
31
33
  attachmentSlot?: ReactNode;
@@ -1 +1 @@
1
- {"version":3,"file":"CommentInputNext.d.ts","sourceRoot":"","sources":["../../../src/components/CommentInputNext/CommentInputNext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAMV,MAAM,OAAO,CAAC;AAOf,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAMrF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/D,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC9D,uDAAuD;IACvD,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;IAC1E,iEAAiE;IACjE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF,eAAO,MAAM,YAAY,8GAmMxB,CAAC"}
1
+ {"version":3,"file":"CommentInputNext.d.ts","sourceRoot":"","sources":["../../../src/components/CommentInputNext/CommentInputNext.tsx"],"names":[],"mappings":"AAAA,OAAO,EAGL,SAAS,EAMV,MAAM,OAAO,CAAC;AAOf,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AAOrF,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB,mEAAmE;IACnE,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,SAAS,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB,WAAW,CAAC,EAAE,qBAAqB,EAAE,CAAC;IACtC,kBAAkB,CAAC,EAAE,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC/D,iBAAiB,CAAC,EAAE,CAAC,EAAE,EAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;IAC9D,uDAAuD;IACvD,mBAAmB,CAAC,EAAE,CAAC,UAAU,EAAE,qBAAqB,CAAC,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC;IAC1E,iEAAiE;IACjE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,CAAC;IACtC,mDAAmD;IACnD,gBAAgB,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,cAAc,CAAC,EAAE,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,SAAS,CAAC;IACpB,MAAM,CAAC,EAAE,SAAS,CAAC;IACnB,6EAA6E;IAC7E,QAAQ,CAAC,EAAE,OAAO,CAAC;IAEnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,CAAC;AAMF,eAAO,MAAM,YAAY,8GAyMxB,CAAC"}
@@ -1,2 +1,2 @@
1
- import o from"@babel/runtime/helpers/defineProperty";import s from"@babel/runtime/helpers/slicedToArray";import{forwardRef as i,useState as c,useRef as n,useCallback as t,useLayoutEffect as e}from"react";import r from"classnames";import{ButtonIcon as m}from"../../componentsV2/ButtonIcon/ButtonIcon.js";import{Tooltip as a}from"../../componentsV2/Tooltip/Tooltip.js";import{ArrowUpIcon as l}from"../../icons/iconParkIcons.js";import"../../icons/customIcons/icons/AddMessage.js";import"../../icons/customIcons/icons/DragOne.js";import"../../icons/customIcons/icons/Attention.js";import"../../icons/customIcons/icons/Collapse.js";import"../../icons/customIcons/icons/Dashboard.js";import"../../icons/customIcons/icons/Expand.js";import"../../icons/customIcons/icons/FolderClosed.js";import"../../icons/customIcons/icons/FolderClosedFilled.js";import"../../icons/customIcons/icons/FolderOpened.js";import"../../icons/customIcons/icons/GreaterOrEqual.js";import"../../icons/customIcons/icons/LessOrEqual.js";import"../../icons/customIcons/icons/Search.js";import"../../icons/customIcons/icons/SearchOne.js";import"../../icons/customIcons/icons/Wellhub.js";import"../../icons/customIcons/icons/MultiRuler.js";import"../../icons/customIcons/icons/Checkbox.js";import"../../icons/customIcons/icons/CheckboxChecked.js";import"../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../icons/customIcons/icons/Radio.js";import"../../icons/customIcons/icons/RadioChecked.js";import"../../icons/customIcons/icons/SimulFrac.js";import"../../icons/customIcons/icons/ZipperFrac.js";import"../../icons/customIcons/icons/CautionFilled.js";import"../../icons/customIcons/icons/MoreApp.js";import"../../icons/customIcons/icons/Pad.js";import"../../icons/customIcons/icons/DrilloutUnit.js";import"../../icons/customIcons/icons/FracFleet.js";import"../../icons/customIcons/icons/Global.js";import"../../icons/customIcons/icons/Program.js";import"../../icons/customIcons/icons/Rig.js";import"../../icons/customIcons/icons/Well.js";import"../../icons/customIcons/icons/Gap.js";import"../../icons/customIcons/icons/Pin.js";import"../../icons/customIcons/icons/CloseOneFilled.js";import"../../icons/customIcons/icons/AttentionFilled.js";import"../../icons/customIcons/icons/CheckOneFilled.js";import"../../icons/customIcons/icons/Archive.js";import"../../icons/customIcons/icons/ArchiveCancel.js";import"../../icons/customIcons/icons/Unarchive.js";import"../../icons/customIcons/icons/Archived.js";import"../../icons/customIcons/icons/InterventionUnit.js";import"../../icons/customIcons/icons/CloudDelete.js";import"../../icons/customIcons/icons/Lasso.js";import"../../icons/customIcons/icons/Radius.js";import"../../icons/customIcons/icons/ErrorOps.js";import"../../icons/customIcons/icons/DataTypeOps.js";import"../../icons/customIcons/icons/FalsePositiveOps.js";import"../../icons/customIcons/icons/CalibrationOps.js";import"../../icons/customIcons/icons/CriticalOps.js";import"../../icons/customIcons/icons/Company.js";import"../../icons/customIcons/icons/ArchiveOne.js";import"../../icons/customIcons/icons/ParseBotFusion.js";import"../../icons/customIcons/icons/Connect.js";import"../../icons/customIcons/icons/PuzzleOne.js";import"../../icons/customIcons/icons/Feed.js";import"../../icons/customIcons/icons/Prompt.js";import"../../icons/customIcons/icons/Companies.js";import"../../icons/customIcons/icons/ClipboardAi.js";import"../../icons/customIcons/icons/Key.js";import"../../icons/customIcons/icons/AtSignCrossed.js";import"../../icons/customIcons/icons/MappingManual.js";import"../../icons/customIcons/icons/Mapping.js";import"../../icons/customIcons/icons/Metrics.js";import"../../icons/customIcons/icons/Drops.js";import"../../icons/customIcons/icons/ClipboardSearch.js";import"../../icons/customIcons/icons/Template.js";import"../../icons/customIcons/icons/ClipboardMetrics.js";import"../../icons/customIcons/icons/ClipboardBuilder.js";import"../../icons/customIcons/icons/UnitConversion.js";import"../../icons/customIcons/icons/NPT.js";import"../../icons/customIcons/icons/GuidedFrac.js";import{AttachmentPreview as p}from"../AttachmentPreview/AttachmentPreview.js";import"../../componentsV2/FileIcon/FileIcon.js";import"@material-ui/core";import{jsxs as u,jsx as d,Fragment as j}from"react/jsx-runtime";import"../AttachmentPreview/AttachmentPreview.scss.js";import"../../utils/main.js";import"file-extension";import"image-extensions";import"video-extensions";import"../../clients/jsonApi/index.js";import"@babel/runtime/helpers/asyncToGenerator";import"@babel/runtime/regenerator";import{useFileDrop as I}from"./useFileDrop.js";import h from"./CommentInputNext.scss.js";function v(o,s){var i=Object.keys(o);if(Object.getOwnPropertySymbols){var c=Object.getOwnPropertySymbols(o);s&&(c=c.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),i.push.apply(i,c)}return i}function b(s){for(var i=1;i<arguments.length;i++){var c=null!=arguments[i]?arguments[i]:{};i%2?v(Object(c),!0).forEach((function(i){o(s,i,c[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(c)):v(Object(c)).forEach((function(o){Object.defineProperty(s,o,Object.getOwnPropertyDescriptor(c,o))}))}return s}var f=i((function(o,i){var v=o.placeholder,f=void 0===v?"Add a comment":v,g=o.value,O=o.onChange,y=o.onSubmit,C=o.onCancel,P=o.disabled,F=o.autoFocus,A=o.minRows,N=void 0===A?1:A,D=o.maxRows,w=o.field,x=o.canSubmit,R=o.bare,S=o.leading,k=o.trailing,E=o.sendTooltip,M=void 0===E?"Send":E,T=o.attachments,B=o.onAttachmentRemove,G=o.onAttachmentRetry,U=o.onAttachmentReorder,z=o.onFilesDrop,H=o.dropLabel,K=void 0===H?"Drop files here":H,L=o.attachmentSlot,V=o.toolbar,q=o.footer,W=o.embedded,Y=o.className,Z=o.testId,J=I(P?void 0:z),Q=J.isDragging,X=J.dropHandlers,$=Q&&d("div",{className:h.dropOverlay,children:K}),_=void 0!==g,oo=c(""),so=s(oo,2),io=so[0],co=so[1],no=_?g:io,to=null!=D?D:R?12:8,eo=n(null),ro=t((function(o){if(eo.current=o,o){var s=o;s.style.height="auto";var i=20*to;s.style.height="".concat(Math.min(s.scrollHeight,i),"px"),s.style.overflowY=s.scrollHeight>i?"auto":"hidden"}}),[to]);e((function(){w||ro(eo.current)}),[no,w,ro]);var mo=(null!=x?x:!!no.trim())&&!P,ao=function(){mo&&(null==y||y(no.trim()),_||w||co(""))},lo=null!=w?w:d("textarea",{ref:ro,className:h.input,rows:N,placeholder:f,value:no,disabled:P,autoFocus:F,onChange:function(o){var s;s=o.target.value,_||co(s),null==O||O(s),ro(o.target)},onKeyDown:function(o){if("Escape"===o.key&&C)return o.preventDefault(),void C();"Enter"!==o.key||o.shiftKey||(o.preventDefault(),ao())}}),po=null!=k?k:d(a,{title:M,children:d("span",{className:h.send,children:d(m,{size:R?"xs":"small",type:"primary",disabled:!mo,onClick:ao,testId:"comment-input-send",children:d(l,{})})})}),uo=((null==T?void 0:T.length)||L)&&u("div",{className:h.attachment,children:[null!=T&&T.length?d(p,{items:T,onRemove:B,onRetry:G,onReorder:U}):null,L]});return u("div",R?b(b({ref:i,"data-testid":Z,className:r(h.rootBare,Y)},X),{},{children:[$,u("div",{className:h.fieldRow,children:[S&&d("div",{className:h.leading,children:S}),u("div",{className:r(h.field,!!uo&&h.fieldExpanded,P&&h.fieldDisabled),children:[u("div",{className:h.fieldMain,children:[lo,uo]}),V&&d("div",{className:h.bareToolbar,children:V}),po]})]})]}):b(b({ref:i,"data-testid":Z,className:r(h.root,W&&h.rootEmbedded,Y)},X),{},{children:[$,u("div",{className:h.inputPanel,children:[lo,uo,u("div",{className:h.toolbarRow,children:[d("div",{className:h.toolbar,children:V}),po]})]}),q&&u(j,{children:[d("div",{className:h.divider}),d("div",{className:h.metaShare,children:q})]})]}))}));export{f as CommentInput};
1
+ import o from"@babel/runtime/helpers/defineProperty";import s from"@babel/runtime/helpers/slicedToArray";import{forwardRef as i,useState as n,useRef as c,useCallback as t,useLayoutEffect as e}from"react";import r from"classnames";import{ButtonIcon as m}from"../../componentsV2/ButtonIcon/ButtonIcon.js";import{Tooltip as a}from"../../componentsV2/Tooltip/Tooltip.js";import{ArrowUpIcon as l}from"../../icons/iconParkIcons.js";import"../../icons/customIcons/icons/AddMessage.js";import"../../icons/customIcons/icons/DragOne.js";import"../../icons/customIcons/icons/Attention.js";import"../../icons/customIcons/icons/Collapse.js";import"../../icons/customIcons/icons/Dashboard.js";import"../../icons/customIcons/icons/Expand.js";import"../../icons/customIcons/icons/FolderClosed.js";import"../../icons/customIcons/icons/FolderClosedFilled.js";import"../../icons/customIcons/icons/FolderOpened.js";import"../../icons/customIcons/icons/GreaterOrEqual.js";import"../../icons/customIcons/icons/LessOrEqual.js";import"../../icons/customIcons/icons/Search.js";import"../../icons/customIcons/icons/SearchOne.js";import"../../icons/customIcons/icons/Wellhub.js";import"../../icons/customIcons/icons/MultiRuler.js";import"../../icons/customIcons/icons/Checkbox.js";import"../../icons/customIcons/icons/CheckboxChecked.js";import"../../icons/customIcons/icons/CheckboxIndeterminate.js";import"../../icons/customIcons/icons/Radio.js";import"../../icons/customIcons/icons/RadioChecked.js";import"../../icons/customIcons/icons/SimulFrac.js";import"../../icons/customIcons/icons/ZipperFrac.js";import"../../icons/customIcons/icons/CautionFilled.js";import"../../icons/customIcons/icons/MoreApp.js";import"../../icons/customIcons/icons/Pad.js";import"../../icons/customIcons/icons/DrilloutUnit.js";import"../../icons/customIcons/icons/FracFleet.js";import"../../icons/customIcons/icons/Global.js";import"../../icons/customIcons/icons/Program.js";import"../../icons/customIcons/icons/Rig.js";import"../../icons/customIcons/icons/Well.js";import"../../icons/customIcons/icons/Gap.js";import"../../icons/customIcons/icons/Pin.js";import"../../icons/customIcons/icons/CloseOneFilled.js";import"../../icons/customIcons/icons/AttentionFilled.js";import"../../icons/customIcons/icons/CheckOneFilled.js";import"../../icons/customIcons/icons/Archive.js";import"../../icons/customIcons/icons/ArchiveCancel.js";import"../../icons/customIcons/icons/Unarchive.js";import"../../icons/customIcons/icons/Archived.js";import"../../icons/customIcons/icons/InterventionUnit.js";import"../../icons/customIcons/icons/CloudDelete.js";import"../../icons/customIcons/icons/Lasso.js";import"../../icons/customIcons/icons/Radius.js";import"../../icons/customIcons/icons/ErrorOps.js";import"../../icons/customIcons/icons/DataTypeOps.js";import"../../icons/customIcons/icons/FalsePositiveOps.js";import"../../icons/customIcons/icons/CalibrationOps.js";import"../../icons/customIcons/icons/CriticalOps.js";import"../../icons/customIcons/icons/Company.js";import"../../icons/customIcons/icons/ArchiveOne.js";import"../../icons/customIcons/icons/ParseBotFusion.js";import"../../icons/customIcons/icons/Connect.js";import"../../icons/customIcons/icons/PuzzleOne.js";import"../../icons/customIcons/icons/Feed.js";import"../../icons/customIcons/icons/Prompt.js";import"../../icons/customIcons/icons/Companies.js";import"../../icons/customIcons/icons/ClipboardAi.js";import"../../icons/customIcons/icons/Key.js";import"../../icons/customIcons/icons/AtSignCrossed.js";import"../../icons/customIcons/icons/MappingManual.js";import"../../icons/customIcons/icons/Mapping.js";import"../../icons/customIcons/icons/Metrics.js";import"../../icons/customIcons/icons/Drops.js";import"../../icons/customIcons/icons/ClipboardSearch.js";import"../../icons/customIcons/icons/Template.js";import"../../icons/customIcons/icons/ClipboardMetrics.js";import"../../icons/customIcons/icons/ClipboardBuilder.js";import"../../icons/customIcons/icons/UnitConversion.js";import"../../icons/customIcons/icons/NPT.js";import"../../icons/customIcons/icons/GuidedFrac.js";import{AttachmentPreview as p}from"../AttachmentPreview/AttachmentPreview.js";import"../../componentsV2/FileIcon/FileIcon.js";import"@material-ui/core";import{jsxs as u,jsx as d,Fragment as j}from"react/jsx-runtime";import"../../componentsV2/Menu/Menu.js";import"@babel/runtime/helpers/asyncToGenerator";import"@babel/runtime/regenerator";import"../../clients/jsonApi/index.js";import"../../utils/main.js";import"../AttachmentPreview/AttachmentImage.js";import"../AttachmentPreview/AttachmentPreview.scss.js";import"file-extension";import"image-extensions";import"video-extensions";import{useFileDrop as I}from"./useFileDrop.js";import{useFilePaste as h}from"./useFilePaste.js";import v from"./CommentInputNext.scss.js";function f(o,s){var i=Object.keys(o);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(o);s&&(n=n.filter((function(s){return Object.getOwnPropertyDescriptor(o,s).enumerable}))),i.push.apply(i,n)}return i}function b(s){for(var i=1;i<arguments.length;i++){var n=null!=arguments[i]?arguments[i]:{};i%2?f(Object(n),!0).forEach((function(i){o(s,i,n[i])})):Object.getOwnPropertyDescriptors?Object.defineProperties(s,Object.getOwnPropertyDescriptors(n)):f(Object(n)).forEach((function(o){Object.defineProperty(s,o,Object.getOwnPropertyDescriptor(n,o))}))}return s}var g=i((function(o,i){var f=o.placeholder,g=void 0===f?"Add a comment":f,O=o.value,y=o.onChange,C=o.onSubmit,P=o.onCancel,F=o.disabled,A=o.autoFocus,N=o.minRows,w=void 0===N?1:N,D=o.maxRows,x=o.field,R=o.canSubmit,k=o.bare,M=o.leading,S=o.trailing,E=o.sendTooltip,T=void 0===E?"Send":E,B=o.attachments,G=o.onAttachmentRemove,L=o.onAttachmentRetry,H=o.onAttachmentReorder,U=o.onFilesDrop,V=o.onImageLinkPaste,z=o.dropLabel,K=void 0===z?"Drop files here":z,q=o.attachmentSlot,W=o.toolbar,Y=o.footer,Z=o.embedded,J=o.className,Q=o.testId,X=I(F?void 0:U),$=X.isDragging,_=X.dropHandlers,oo=h(F?{}:{onFiles:U,onImageLink:V}).pasteHandlers,so=$&&d("div",{className:v.dropOverlay,children:K}),io=void 0!==O,no=n(""),co=s(no,2),to=co[0],eo=co[1],ro=io?O:to,mo=null!=D?D:k?12:8,ao=c(null),lo=t((function(o){if(ao.current=o,o){var s=o;s.style.height="auto";var i=20*mo;s.style.height="".concat(Math.min(s.scrollHeight,i),"px"),s.style.overflowY=s.scrollHeight>i?"auto":"hidden"}}),[mo]);e((function(){x||lo(ao.current)}),[ro,x,lo]);var po=(null!=R?R:!!ro.trim())&&!F,uo=function(){po&&(null==C||C(ro.trim()),io||x||eo(""))},jo=null!=x?x:d("textarea",{ref:lo,className:v.input,rows:w,placeholder:g,value:ro,disabled:F,autoFocus:A,onChange:function(o){var s;s=o.target.value,io||eo(s),null==y||y(s),lo(o.target)},onKeyDown:function(o){if("Escape"===o.key&&P)return o.preventDefault(),void P();"Enter"!==o.key||o.shiftKey||(o.preventDefault(),uo())}}),Io=null!=S?S:d(a,{title:T,children:d("span",{className:v.send,children:d(m,{size:k?"xs":"small",type:"primary",disabled:!po,onClick:uo,testId:"comment-input-send",children:d(l,{})})})}),ho=((null==B?void 0:B.length)||q)&&u("div",{className:v.attachment,children:[null!=B&&B.length?d(p,{items:B,onRemove:G,onRetry:L,onReorder:H}):null,q]});return u("div",k?b(b(b({ref:i,"data-testid":Q,className:r(v.rootBare,J)},_),oo),{},{children:[so,u("div",{className:v.fieldRow,children:[M&&d("div",{className:v.leading,children:M}),u("div",{className:r(v.field,!!ho&&v.fieldExpanded,F&&v.fieldDisabled),children:[u("div",{className:v.fieldMain,children:[jo,ho]}),W&&d("div",{className:v.bareToolbar,children:W}),Io]})]})]}):b(b(b({ref:i,"data-testid":Q,className:r(v.root,Z&&v.rootEmbedded,J)},_),oo),{},{children:[so,u("div",{className:v.inputPanel,children:[jo,ho,u("div",{className:v.toolbarRow,children:[d("div",{className:v.toolbar,children:W}),Io]})]}),Y&&u(j,{children:[d("div",{className:v.divider}),d("div",{className:v.metaShare,children:Y})]})]}))}));export{g as CommentInput};
2
2
  //# sourceMappingURL=CommentInputNext.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CommentInputNext.js","sources":["../../../src/components/CommentInputNext/CommentInputNext.tsx"],"sourcesContent":["import {\n forwardRef,\n KeyboardEvent,\n ReactNode,\n useState,\n useCallback,\n useRef,\n useLayoutEffect,\n ChangeEvent,\n} from 'react';\nimport classNames from 'classnames';\n\nimport { ButtonIcon } from '../../componentsV2/ButtonIcon';\nimport { Tooltip } from '../../componentsV2/Tooltip';\nimport { ArrowUpIcon } from '../../icons';\nimport { AttachmentPreview } from '../AttachmentPreview';\nimport { AttachmentPreviewItem } from '../AttachmentPreview/AttachmentPreview.types';\n\nimport { useFileDrop } from './useFileDrop';\n\nimport styles from './CommentInputNext.scss';\n\nexport type CommentInputProps = {\n placeholder?: string;\n value?: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n onCancel?: () => void;\n disabled?: boolean;\n autoFocus?: boolean;\n minRows?: number;\n maxRows?: number;\n\n /** Editable control rendered in place of the built-in textarea. */\n field?: ReactNode;\n canSubmit?: boolean;\n /** Drop the outer surface so the field sits flush, for the in-card reply input. */\n bare?: boolean;\n\n leading?: ReactNode;\n /** Replaces the default send button. */\n trailing?: ReactNode;\n sendTooltip?: string;\n\n attachments?: AttachmentPreviewItem[];\n onAttachmentRemove?: (id: AttachmentPreviewItem['id']) => void;\n onAttachmentRetry?: (id: AttachmentPreviewItem['id']) => void;\n /** Enables drag-to-reorder on the attachment strip. */\n onAttachmentReorder?: (orderedIds: AttachmentPreviewItem['id'][]) => void;\n /** Enables dropping files from the desktop onto the composer. */\n onFilesDrop?: (files: File[]) => void;\n dropLabel?: string;\n /** Extra content in the attachment area, e.g. an upload-error banner. */\n attachmentSlot?: ReactNode;\n toolbar?: ReactNode;\n footer?: ReactNode;\n /** Render flush inside a host surface: no background, full-width divider. */\n embedded?: boolean;\n\n className?: string;\n testId?: string;\n};\n\nconst LINE_HEIGHT_PX = 20;\nconst DEFAULT_MAX_ROWS = 8;\nconst BARE_MAX_ROWS = 12;\n\nexport const CommentInput = forwardRef<HTMLDivElement, CommentInputProps>(\n (\n {\n placeholder = 'Add a comment',\n value,\n onChange,\n onSubmit,\n onCancel,\n disabled,\n autoFocus,\n minRows = 1,\n maxRows,\n field,\n canSubmit,\n bare,\n leading,\n trailing,\n sendTooltip = 'Send',\n attachments,\n onAttachmentRemove,\n onAttachmentRetry,\n onAttachmentReorder,\n onFilesDrop,\n dropLabel = 'Drop files here',\n attachmentSlot,\n toolbar,\n footer,\n embedded,\n className,\n testId,\n },\n ref\n ) => {\n const { isDragging, dropHandlers } = useFileDrop(disabled ? undefined : onFilesDrop);\n const dropOverlay = isDragging && <div className={styles.dropOverlay}>{dropLabel}</div>;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState('');\n const text = isControlled ? value : internalValue;\n\n // The bare reply field has no toolbar row, so text may fill the whole box.\n const rowsCap = maxRows ?? (bare ? BARE_MAX_ROWS : DEFAULT_MAX_ROWS);\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const resize = useCallback(\n (el: HTMLTextAreaElement | null) => {\n textareaRef.current = el;\n if (!el) return;\n const node = el;\n node.style.height = 'auto';\n const maxHeight = rowsCap * LINE_HEIGHT_PX;\n node.style.height = `${Math.min(node.scrollHeight, maxHeight)}px`;\n node.style.overflowY = node.scrollHeight > maxHeight ? 'auto' : 'hidden';\n },\n [rowsCap]\n );\n\n // The ref callback won't fire for a prop-driven value change.\n useLayoutEffect(() => {\n if (!field) resize(textareaRef.current);\n }, [text, field, resize]);\n\n const setText = (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n };\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n setText(event.target.value);\n resize(event.target);\n };\n\n const canSend = (canSubmit ?? !!text.trim()) && !disabled;\n\n const submit = () => {\n if (!canSend) return;\n onSubmit?.(text.trim());\n if (!isControlled && !field) setInternalValue('');\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Escape' && onCancel) {\n event.preventDefault();\n onCancel();\n return;\n }\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n };\n\n const editor = field ?? (\n <textarea\n ref={resize}\n className={styles.input}\n rows={minRows}\n placeholder={placeholder}\n value={text}\n disabled={disabled}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n />\n );\n\n const sendButton = trailing ?? (\n // A disabled button fires no events, so the tooltip needs its own target.\n <Tooltip title={sendTooltip}>\n <span className={styles.send}>\n <ButtonIcon\n size={bare ? 'xs' : 'small'}\n type=\"primary\"\n disabled={!canSend}\n onClick={submit}\n testId=\"comment-input-send\"\n >\n <ArrowUpIcon />\n </ButtonIcon>\n </span>\n </Tooltip>\n );\n\n const attachmentArea = (attachments?.length || attachmentSlot) && (\n <div className={styles.attachment}>\n {attachments?.length ? (\n <AttachmentPreview\n items={attachments}\n onRemove={onAttachmentRemove}\n onRetry={onAttachmentRetry}\n onReorder={onAttachmentReorder}\n />\n ) : null}\n {attachmentSlot}\n </div>\n );\n\n if (bare) {\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={classNames(styles.rootBare, className)}\n {...dropHandlers}\n >\n {dropOverlay}\n <div className={styles.fieldRow}>\n {leading && <div className={styles.leading}>{leading}</div>}\n <div\n className={classNames(\n styles.field,\n !!attachmentArea && styles.fieldExpanded,\n disabled && styles.fieldDisabled\n )}\n >\n <div className={styles.fieldMain}>\n {editor}\n {attachmentArea}\n </div>\n {toolbar && <div className={styles.bareToolbar}>{toolbar}</div>}\n {sendButton}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={classNames(styles.root, embedded && styles.rootEmbedded, className)}\n {...dropHandlers}\n >\n {dropOverlay}\n <div className={styles.inputPanel}>\n {editor}\n {attachmentArea}\n <div className={styles.toolbarRow}>\n <div className={styles.toolbar}>{toolbar}</div>\n {sendButton}\n </div>\n </div>\n\n {footer && (\n <>\n <div className={styles.divider} />\n <div className={styles.metaShare}>{footer}</div>\n </>\n )}\n </div>\n );\n }\n);\n"],"names":["CommentInput","forwardRef","_ref","ref","_ref$placeholder","placeholder","value","onChange","onSubmit","onCancel","disabled","autoFocus","_ref$minRows","minRows","maxRows","field","canSubmit","bare","leading","trailing","_ref$sendTooltip","sendTooltip","attachments","onAttachmentRemove","onAttachmentRetry","onAttachmentReorder","onFilesDrop","_ref$dropLabel","dropLabel","attachmentSlot","toolbar","footer","embedded","className","testId","_useFileDrop","useFileDrop","undefined","isDragging","dropHandlers","dropOverlay","_jsx","styles","children","isControlled","useState","_useState2","_slicedToArray","_useState","internalValue","setInternalValue","text","rowsCap","textareaRef","useRef","resize","useCallback","el","current","node","style","height","maxHeight","Math","min","scrollHeight","overflowY","useLayoutEffect","canSend","trim","submit","editor","input","rows","event","next","target","onKeyDown","key","preventDefault","shiftKey","sendButton","Tooltip","title","send","ButtonIcon","size","type","onClick","ArrowUpIcon","attachmentArea","length","_jsxs","attachment","AttachmentPreview","items","onRemove","onRetry","onReorder","_objectSpread","classNames","rootBare","fieldRow","fieldExpanded","fieldDisabled","fieldMain","bareToolbar","root","rootEmbedded","inputPanel","toolbarRow","_Fragment","divider","metaShare"],"mappings":"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"}
1
+ {"version":3,"file":"CommentInputNext.js","sources":["../../../src/components/CommentInputNext/CommentInputNext.tsx"],"sourcesContent":["import {\n forwardRef,\n KeyboardEvent,\n ReactNode,\n useState,\n useCallback,\n useRef,\n useLayoutEffect,\n ChangeEvent,\n} from 'react';\nimport classNames from 'classnames';\n\nimport { ButtonIcon } from '../../componentsV2/ButtonIcon';\nimport { Tooltip } from '../../componentsV2/Tooltip';\nimport { ArrowUpIcon } from '../../icons';\nimport { AttachmentPreview } from '../AttachmentPreview';\nimport { AttachmentPreviewItem } from '../AttachmentPreview/AttachmentPreview.types';\n\nimport { useFileDrop } from './useFileDrop';\nimport { useFilePaste } from './useFilePaste';\n\nimport styles from './CommentInputNext.scss';\n\nexport type CommentInputProps = {\n placeholder?: string;\n value?: string;\n onChange?: (value: string) => void;\n onSubmit?: (value: string) => void;\n onCancel?: () => void;\n disabled?: boolean;\n autoFocus?: boolean;\n minRows?: number;\n maxRows?: number;\n\n /** Editable control rendered in place of the built-in textarea. */\n field?: ReactNode;\n canSubmit?: boolean;\n /** Drop the outer surface so the field sits flush, for the in-card reply input. */\n bare?: boolean;\n\n leading?: ReactNode;\n /** Replaces the default send button. */\n trailing?: ReactNode;\n sendTooltip?: string;\n\n attachments?: AttachmentPreviewItem[];\n onAttachmentRemove?: (id: AttachmentPreviewItem['id']) => void;\n onAttachmentRetry?: (id: AttachmentPreviewItem['id']) => void;\n /** Enables drag-to-reorder on the attachment strip. */\n onAttachmentReorder?: (orderedIds: AttachmentPreviewItem['id'][]) => void;\n /** Enables dropping files from the desktop onto the composer. */\n onFilesDrop?: (files: File[]) => void;\n /** Given a pasted link that points at an image. */\n onImageLinkPaste?: (url: string) => void;\n dropLabel?: string;\n /** Extra content in the attachment area, e.g. an upload-error banner. */\n attachmentSlot?: ReactNode;\n toolbar?: ReactNode;\n footer?: ReactNode;\n /** Render flush inside a host surface: no background, full-width divider. */\n embedded?: boolean;\n\n className?: string;\n testId?: string;\n};\n\nconst LINE_HEIGHT_PX = 20;\nconst DEFAULT_MAX_ROWS = 8;\nconst BARE_MAX_ROWS = 12;\n\nexport const CommentInput = forwardRef<HTMLDivElement, CommentInputProps>(\n (\n {\n placeholder = 'Add a comment',\n value,\n onChange,\n onSubmit,\n onCancel,\n disabled,\n autoFocus,\n minRows = 1,\n maxRows,\n field,\n canSubmit,\n bare,\n leading,\n trailing,\n sendTooltip = 'Send',\n attachments,\n onAttachmentRemove,\n onAttachmentRetry,\n onAttachmentReorder,\n onFilesDrop,\n onImageLinkPaste,\n dropLabel = 'Drop files here',\n attachmentSlot,\n toolbar,\n footer,\n embedded,\n className,\n testId,\n },\n ref\n ) => {\n const { isDragging, dropHandlers } = useFileDrop(disabled ? undefined : onFilesDrop);\n const { pasteHandlers } = useFilePaste(\n disabled ? {} : { onFiles: onFilesDrop, onImageLink: onImageLinkPaste }\n );\n const dropOverlay = isDragging && <div className={styles.dropOverlay}>{dropLabel}</div>;\n\n const isControlled = value !== undefined;\n const [internalValue, setInternalValue] = useState('');\n const text = isControlled ? value : internalValue;\n\n // The bare reply field has no toolbar row, so text may fill the whole box.\n const rowsCap = maxRows ?? (bare ? BARE_MAX_ROWS : DEFAULT_MAX_ROWS);\n\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n const resize = useCallback(\n (el: HTMLTextAreaElement | null) => {\n textareaRef.current = el;\n if (!el) return;\n const node = el;\n node.style.height = 'auto';\n const maxHeight = rowsCap * LINE_HEIGHT_PX;\n node.style.height = `${Math.min(node.scrollHeight, maxHeight)}px`;\n node.style.overflowY = node.scrollHeight > maxHeight ? 'auto' : 'hidden';\n },\n [rowsCap]\n );\n\n // The ref callback won't fire for a prop-driven value change.\n useLayoutEffect(() => {\n if (!field) resize(textareaRef.current);\n }, [text, field, resize]);\n\n const setText = (next: string) => {\n if (!isControlled) setInternalValue(next);\n onChange?.(next);\n };\n\n const handleChange = (event: ChangeEvent<HTMLTextAreaElement>) => {\n setText(event.target.value);\n resize(event.target);\n };\n\n const canSend = (canSubmit ?? !!text.trim()) && !disabled;\n\n const submit = () => {\n if (!canSend) return;\n onSubmit?.(text.trim());\n if (!isControlled && !field) setInternalValue('');\n };\n\n const handleKeyDown = (event: KeyboardEvent<HTMLTextAreaElement>) => {\n if (event.key === 'Escape' && onCancel) {\n event.preventDefault();\n onCancel();\n return;\n }\n\n if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n submit();\n }\n };\n\n const editor = field ?? (\n <textarea\n ref={resize}\n className={styles.input}\n rows={minRows}\n placeholder={placeholder}\n value={text}\n disabled={disabled}\n // eslint-disable-next-line jsx-a11y/no-autofocus\n autoFocus={autoFocus}\n onChange={handleChange}\n onKeyDown={handleKeyDown}\n />\n );\n\n const sendButton = trailing ?? (\n // A disabled button fires no events, so the tooltip needs its own target.\n <Tooltip title={sendTooltip}>\n <span className={styles.send}>\n <ButtonIcon\n size={bare ? 'xs' : 'small'}\n type=\"primary\"\n disabled={!canSend}\n onClick={submit}\n testId=\"comment-input-send\"\n >\n <ArrowUpIcon />\n </ButtonIcon>\n </span>\n </Tooltip>\n );\n\n const attachmentArea = (attachments?.length || attachmentSlot) && (\n <div className={styles.attachment}>\n {attachments?.length ? (\n <AttachmentPreview\n items={attachments}\n onRemove={onAttachmentRemove}\n onRetry={onAttachmentRetry}\n onReorder={onAttachmentReorder}\n />\n ) : null}\n {attachmentSlot}\n </div>\n );\n\n if (bare) {\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={classNames(styles.rootBare, className)}\n {...dropHandlers}\n {...pasteHandlers}\n >\n {dropOverlay}\n <div className={styles.fieldRow}>\n {leading && <div className={styles.leading}>{leading}</div>}\n <div\n className={classNames(\n styles.field,\n !!attachmentArea && styles.fieldExpanded,\n disabled && styles.fieldDisabled\n )}\n >\n <div className={styles.fieldMain}>\n {editor}\n {attachmentArea}\n </div>\n {toolbar && <div className={styles.bareToolbar}>{toolbar}</div>}\n {sendButton}\n </div>\n </div>\n </div>\n );\n }\n\n return (\n <div\n ref={ref}\n data-testid={testId}\n className={classNames(styles.root, embedded && styles.rootEmbedded, className)}\n {...dropHandlers}\n {...pasteHandlers}\n >\n {dropOverlay}\n <div className={styles.inputPanel}>\n {editor}\n {attachmentArea}\n <div className={styles.toolbarRow}>\n <div className={styles.toolbar}>{toolbar}</div>\n {sendButton}\n </div>\n </div>\n\n {footer && (\n <>\n <div className={styles.divider} />\n <div className={styles.metaShare}>{footer}</div>\n </>\n )}\n </div>\n );\n }\n);\n"],"names":["CommentInput","forwardRef","_ref","ref","_ref$placeholder","placeholder","value","onChange","onSubmit","onCancel","disabled","autoFocus","_ref$minRows","minRows","maxRows","field","canSubmit","bare","leading","trailing","_ref$sendTooltip","sendTooltip","attachments","onAttachmentRemove","onAttachmentRetry","onAttachmentReorder","onFilesDrop","onImageLinkPaste","_ref$dropLabel","dropLabel","attachmentSlot","toolbar","footer","embedded","className","testId","_useFileDrop","useFileDrop","undefined","isDragging","dropHandlers","pasteHandlers","useFilePaste","onFiles","onImageLink","dropOverlay","_jsx","styles","children","isControlled","useState","_useState2","_slicedToArray","_useState","internalValue","setInternalValue","text","rowsCap","textareaRef","useRef","resize","useCallback","el","current","node","style","height","maxHeight","Math","min","scrollHeight","overflowY","useLayoutEffect","canSend","trim","submit","editor","input","rows","event","next","target","onKeyDown","key","preventDefault","shiftKey","sendButton","Tooltip","title","send","ButtonIcon","size","type","onClick","ArrowUpIcon","attachmentArea","length","_jsxs","attachment","AttachmentPreview","items","onRemove","onRetry","onReorder","_objectSpread","classNames","rootBare","fieldRow","fieldExpanded","fieldDisabled","fieldMain","bareToolbar","root","rootEmbedded","inputPanel","toolbarRow","_Fragment","divider","metaShare"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useFilePaste.test.d.ts.map