@liveblocks/react-ui 2.14.0-v2encoding → 2.15.0-debug1

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 (258) hide show
  1. package/dist/_private/index.d.mts +24 -22
  2. package/dist/_private/index.d.ts +24 -22
  3. package/dist/components/Comment.js +355 -254
  4. package/dist/components/Comment.js.map +1 -1
  5. package/dist/components/Comment.mjs +330 -229
  6. package/dist/components/Comment.mjs.map +1 -1
  7. package/dist/components/Composer.js +304 -221
  8. package/dist/components/Composer.js.map +1 -1
  9. package/dist/components/Composer.mjs +278 -195
  10. package/dist/components/Composer.mjs.map +1 -1
  11. package/dist/components/HistoryVersionSummary.js +25 -22
  12. package/dist/components/HistoryVersionSummary.js.map +1 -1
  13. package/dist/components/HistoryVersionSummary.mjs +24 -21
  14. package/dist/components/HistoryVersionSummary.mjs.map +1 -1
  15. package/dist/components/HistoryVersionSummaryList.js +10 -9
  16. package/dist/components/HistoryVersionSummaryList.js.map +1 -1
  17. package/dist/components/HistoryVersionSummaryList.mjs +9 -8
  18. package/dist/components/HistoryVersionSummaryList.mjs.map +1 -1
  19. package/dist/components/InboxNotification.js +201 -143
  20. package/dist/components/InboxNotification.js.map +1 -1
  21. package/dist/components/InboxNotification.mjs +179 -121
  22. package/dist/components/InboxNotification.mjs.map +1 -1
  23. package/dist/components/InboxNotificationList.js +18 -14
  24. package/dist/components/InboxNotificationList.js.map +1 -1
  25. package/dist/components/InboxNotificationList.mjs +16 -12
  26. package/dist/components/InboxNotificationList.mjs.map +1 -1
  27. package/dist/components/Thread.js +103 -86
  28. package/dist/components/Thread.js.map +1 -1
  29. package/dist/components/Thread.mjs +92 -75
  30. package/dist/components/Thread.mjs.map +1 -1
  31. package/dist/components/internal/Attachment.js +158 -107
  32. package/dist/components/internal/Attachment.js.map +1 -1
  33. package/dist/components/internal/Attachment.mjs +147 -96
  34. package/dist/components/internal/Attachment.mjs.map +1 -1
  35. package/dist/components/internal/Attribution.js +15 -13
  36. package/dist/components/internal/Attribution.js.map +1 -1
  37. package/dist/components/internal/Attribution.mjs +15 -13
  38. package/dist/components/internal/Attribution.mjs.map +1 -1
  39. package/dist/components/internal/Avatar.js +26 -20
  40. package/dist/components/internal/Avatar.js.map +1 -1
  41. package/dist/components/internal/Avatar.mjs +22 -16
  42. package/dist/components/internal/Avatar.mjs.map +1 -1
  43. package/dist/components/internal/Button.js +4 -4
  44. package/dist/components/internal/Button.js.map +1 -1
  45. package/dist/components/internal/Button.mjs +3 -3
  46. package/dist/components/internal/Button.mjs.map +1 -1
  47. package/dist/components/internal/Dropdown.js +26 -19
  48. package/dist/components/internal/Dropdown.js.map +1 -1
  49. package/dist/components/internal/Dropdown.mjs +25 -18
  50. package/dist/components/internal/Dropdown.mjs.map +1 -1
  51. package/dist/components/internal/Emoji.js +4 -3
  52. package/dist/components/internal/Emoji.js.map +1 -1
  53. package/dist/components/internal/Emoji.mjs +3 -2
  54. package/dist/components/internal/Emoji.mjs.map +1 -1
  55. package/dist/components/internal/EmojiPicker.js +96 -72
  56. package/dist/components/internal/EmojiPicker.js.map +1 -1
  57. package/dist/components/internal/EmojiPicker.mjs +90 -66
  58. package/dist/components/internal/EmojiPicker.mjs.map +1 -1
  59. package/dist/components/internal/Icon.js +5 -4
  60. package/dist/components/internal/Icon.js.map +1 -1
  61. package/dist/components/internal/Icon.mjs +5 -4
  62. package/dist/components/internal/Icon.mjs.map +1 -1
  63. package/dist/components/internal/InboxNotificationThread.js +53 -38
  64. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  65. package/dist/components/internal/InboxNotificationThread.mjs +53 -38
  66. package/dist/components/internal/InboxNotificationThread.mjs.map +1 -1
  67. package/dist/components/internal/List.js +8 -6
  68. package/dist/components/internal/List.js.map +1 -1
  69. package/dist/components/internal/List.mjs +6 -4
  70. package/dist/components/internal/List.mjs.map +1 -1
  71. package/dist/components/internal/Room.js +7 -6
  72. package/dist/components/internal/Room.js.map +1 -1
  73. package/dist/components/internal/Room.mjs +6 -5
  74. package/dist/components/internal/Room.mjs.map +1 -1
  75. package/dist/components/internal/Tooltip.js +48 -33
  76. package/dist/components/internal/Tooltip.js.map +1 -1
  77. package/dist/components/internal/Tooltip.mjs +45 -30
  78. package/dist/components/internal/Tooltip.mjs.map +1 -1
  79. package/dist/components/internal/User.js +7 -6
  80. package/dist/components/internal/User.js.map +1 -1
  81. package/dist/components/internal/User.mjs +6 -5
  82. package/dist/components/internal/User.mjs.map +1 -1
  83. package/dist/components.js +11 -29
  84. package/dist/components.js.map +1 -1
  85. package/dist/components.mjs +5 -5
  86. package/dist/components.mjs.map +1 -1
  87. package/dist/config.js +15 -12
  88. package/dist/config.js.map +1 -1
  89. package/dist/config.mjs +12 -9
  90. package/dist/config.mjs.map +1 -1
  91. package/dist/icons/ArrowDown.js +7 -6
  92. package/dist/icons/ArrowDown.js.map +1 -1
  93. package/dist/icons/ArrowDown.mjs +7 -6
  94. package/dist/icons/ArrowDown.mjs.map +1 -1
  95. package/dist/icons/ArrowUp.js +7 -6
  96. package/dist/icons/ArrowUp.js.map +1 -1
  97. package/dist/icons/ArrowUp.mjs +7 -6
  98. package/dist/icons/ArrowUp.mjs.map +1 -1
  99. package/dist/icons/Attachment.js +7 -6
  100. package/dist/icons/Attachment.js.map +1 -1
  101. package/dist/icons/Attachment.mjs +7 -6
  102. package/dist/icons/Attachment.mjs.map +1 -1
  103. package/dist/icons/Bold.js +7 -6
  104. package/dist/icons/Bold.js.map +1 -1
  105. package/dist/icons/Bold.mjs +7 -6
  106. package/dist/icons/Bold.mjs.map +1 -1
  107. package/dist/icons/Check.js +7 -6
  108. package/dist/icons/Check.js.map +1 -1
  109. package/dist/icons/Check.mjs +7 -6
  110. package/dist/icons/Check.mjs.map +1 -1
  111. package/dist/icons/Code.js +7 -6
  112. package/dist/icons/Code.js.map +1 -1
  113. package/dist/icons/Code.mjs +7 -6
  114. package/dist/icons/Code.mjs.map +1 -1
  115. package/dist/icons/Cross.js +12 -8
  116. package/dist/icons/Cross.js.map +1 -1
  117. package/dist/icons/Cross.mjs +12 -8
  118. package/dist/icons/Cross.mjs.map +1 -1
  119. package/dist/icons/Delete.js +7 -6
  120. package/dist/icons/Delete.js.map +1 -1
  121. package/dist/icons/Delete.mjs +7 -6
  122. package/dist/icons/Delete.mjs.map +1 -1
  123. package/dist/icons/Edit.js +7 -6
  124. package/dist/icons/Edit.js.map +1 -1
  125. package/dist/icons/Edit.mjs +7 -6
  126. package/dist/icons/Edit.mjs.map +1 -1
  127. package/dist/icons/Ellipsis.js +21 -16
  128. package/dist/icons/Ellipsis.js.map +1 -1
  129. package/dist/icons/Ellipsis.mjs +21 -16
  130. package/dist/icons/Ellipsis.mjs.map +1 -1
  131. package/dist/icons/Emoji.js +25 -18
  132. package/dist/icons/Emoji.js.map +1 -1
  133. package/dist/icons/Emoji.mjs +25 -18
  134. package/dist/icons/Emoji.mjs.map +1 -1
  135. package/dist/icons/EmojiAdd.js +28 -20
  136. package/dist/icons/EmojiAdd.js.map +1 -1
  137. package/dist/icons/EmojiAdd.mjs +28 -20
  138. package/dist/icons/EmojiAdd.mjs.map +1 -1
  139. package/dist/icons/Italic.js +7 -6
  140. package/dist/icons/Italic.js.map +1 -1
  141. package/dist/icons/Italic.mjs +7 -6
  142. package/dist/icons/Italic.mjs.map +1 -1
  143. package/dist/icons/Mention.js +12 -8
  144. package/dist/icons/Mention.js.map +1 -1
  145. package/dist/icons/Mention.mjs +12 -8
  146. package/dist/icons/Mention.mjs.map +1 -1
  147. package/dist/icons/Resolve.js +14 -10
  148. package/dist/icons/Resolve.js.map +1 -1
  149. package/dist/icons/Resolve.mjs +14 -10
  150. package/dist/icons/Resolve.mjs.map +1 -1
  151. package/dist/icons/Resolved.js +16 -12
  152. package/dist/icons/Resolved.js.map +1 -1
  153. package/dist/icons/Resolved.mjs +16 -12
  154. package/dist/icons/Resolved.mjs.map +1 -1
  155. package/dist/icons/Restore.js +12 -8
  156. package/dist/icons/Restore.js.map +1 -1
  157. package/dist/icons/Restore.mjs +12 -8
  158. package/dist/icons/Restore.mjs.map +1 -1
  159. package/dist/icons/Search.js +7 -6
  160. package/dist/icons/Search.js.map +1 -1
  161. package/dist/icons/Search.mjs +7 -6
  162. package/dist/icons/Search.mjs.map +1 -1
  163. package/dist/icons/Send.js +7 -6
  164. package/dist/icons/Send.js.map +1 -1
  165. package/dist/icons/Send.mjs +7 -6
  166. package/dist/icons/Send.mjs.map +1 -1
  167. package/dist/icons/Spinner.js +8 -7
  168. package/dist/icons/Spinner.js.map +1 -1
  169. package/dist/icons/Spinner.mjs +8 -7
  170. package/dist/icons/Spinner.mjs.map +1 -1
  171. package/dist/icons/Strikethrough.js +7 -6
  172. package/dist/icons/Strikethrough.js.map +1 -1
  173. package/dist/icons/Strikethrough.mjs +7 -6
  174. package/dist/icons/Strikethrough.mjs.map +1 -1
  175. package/dist/icons/Warning.js +14 -10
  176. package/dist/icons/Warning.js.map +1 -1
  177. package/dist/icons/Warning.mjs +14 -10
  178. package/dist/icons/Warning.mjs.map +1 -1
  179. package/dist/index.d.mts +14 -12
  180. package/dist/index.d.ts +14 -12
  181. package/dist/overrides.js +64 -36
  182. package/dist/overrides.js.map +1 -1
  183. package/dist/overrides.mjs +58 -12
  184. package/dist/overrides.mjs.map +1 -1
  185. package/dist/primitives/Comment/index.js +75 -66
  186. package/dist/primitives/Comment/index.js.map +1 -1
  187. package/dist/primitives/Comment/index.mjs +71 -62
  188. package/dist/primitives/Comment/index.mjs.map +1 -1
  189. package/dist/primitives/Composer/contexts.js +11 -11
  190. package/dist/primitives/Composer/index.js +327 -270
  191. package/dist/primitives/Composer/index.js.map +1 -1
  192. package/dist/primitives/Composer/index.mjs +250 -193
  193. package/dist/primitives/Composer/index.mjs.map +1 -1
  194. package/dist/primitives/Composer/utils.js +18 -20
  195. package/dist/primitives/Composer/utils.js.map +1 -1
  196. package/dist/primitives/Composer/utils.mjs +1 -3
  197. package/dist/primitives/Composer/utils.mjs.map +1 -1
  198. package/dist/primitives/EmojiPicker/contexts.js +3 -3
  199. package/dist/primitives/EmojiPicker/index.js +159 -142
  200. package/dist/primitives/EmojiPicker/index.js.map +1 -1
  201. package/dist/primitives/EmojiPicker/index.mjs +120 -103
  202. package/dist/primitives/EmojiPicker/index.mjs.map +1 -1
  203. package/dist/primitives/FileSize.js +8 -7
  204. package/dist/primitives/FileSize.js.map +1 -1
  205. package/dist/primitives/FileSize.mjs +6 -5
  206. package/dist/primitives/FileSize.mjs.map +1 -1
  207. package/dist/primitives/Timestamp.js +11 -10
  208. package/dist/primitives/Timestamp.js.map +1 -1
  209. package/dist/primitives/Timestamp.mjs +6 -5
  210. package/dist/primitives/Timestamp.mjs.map +1 -1
  211. package/dist/primitives/index.d.mts +24 -23
  212. package/dist/primitives/index.d.ts +24 -23
  213. package/dist/primitives/internal/Emoji.js +7 -5
  214. package/dist/primitives/internal/Emoji.js.map +1 -1
  215. package/dist/primitives/internal/Emoji.mjs +6 -4
  216. package/dist/primitives/internal/Emoji.mjs.map +1 -1
  217. package/dist/shared.js +2 -7
  218. package/dist/shared.js.map +1 -1
  219. package/dist/shared.mjs +2 -7
  220. package/dist/shared.mjs.map +1 -1
  221. package/dist/utils/Persist.js +18 -18
  222. package/dist/utils/Persist.js.map +1 -1
  223. package/dist/utils/Persist.mjs +6 -6
  224. package/dist/utils/Persist.mjs.map +1 -1
  225. package/dist/utils/Portal.js +4 -4
  226. package/dist/utils/Portal.js.map +1 -1
  227. package/dist/utils/Portal.mjs +3 -3
  228. package/dist/utils/Portal.mjs.map +1 -1
  229. package/dist/utils/use-controllable-state.js +5 -5
  230. package/dist/utils/use-index.js +7 -7
  231. package/dist/utils/use-initial.js +2 -2
  232. package/dist/utils/use-interval.js +4 -4
  233. package/dist/utils/use-latest.js +3 -3
  234. package/dist/utils/use-observable.js +2 -2
  235. package/dist/utils/use-refs.js +2 -2
  236. package/dist/utils/use-rerender.js +2 -2
  237. package/dist/utils/use-visible.js +2 -2
  238. package/dist/utils/use-window-focus.js +2 -2
  239. package/dist/utils/use-window-focus.js.map +1 -1
  240. package/dist/utils/use-window-focus.mjs +1 -1
  241. package/dist/utils/use-window-focus.mjs.map +1 -1
  242. package/dist/version.js +1 -1
  243. package/dist/version.js.map +1 -1
  244. package/dist/version.mjs +1 -1
  245. package/dist/version.mjs.map +1 -1
  246. package/package.json +6 -8
  247. package/dist/utils/use-id.js +0 -29
  248. package/dist/utils/use-id.js.map +0 -1
  249. package/dist/utils/use-id.mjs +0 -27
  250. package/dist/utils/use-id.mjs.map +0 -1
  251. package/dist/utils/use-layout-effect.js +0 -8
  252. package/dist/utils/use-layout-effect.js.map +0 -1
  253. package/dist/utils/use-layout-effect.mjs +0 -6
  254. package/dist/utils/use-layout-effect.mjs.map +0 -1
  255. package/dist/utils/use-transition.js +0 -16
  256. package/dist/utils/use-transition.js.map +0 -1
  257. package/dist/utils/use-transition.mjs +0 -14
  258. package/dist/utils/use-transition.mjs.map +0 -1
@@ -1,8 +1,8 @@
1
- 'use client';
2
1
  'use strict';
3
2
 
3
+ var jsxRuntime = require('react/jsx-runtime');
4
4
  var _private = require('@liveblocks/react/_private');
5
- var React = require('react');
5
+ var react = require('react');
6
6
  var Cross = require('../../icons/Cross.js');
7
7
  var Spinner = require('../../icons/Spinner.js');
8
8
  var Warning = require('../../icons/Warning.js');
@@ -26,35 +26,35 @@ function splitFileName(name) {
26
26
  }
27
27
  function getAttachmentIconGlyph(mimeType) {
28
28
  if (mimeType === "application/zip" || mimeType === "application/gzip" || mimeType === "application/vnd.rar" || mimeType === "application/x-rar-compressed" || mimeType === "application/x-7z-compressed" || mimeType === "application/x-zip-compressed" || mimeType === "application/x-tar" || mimeType === "application/x-bzip" || mimeType === "application/x-bzip2") {
29
- return /* @__PURE__ */ React.createElement("path", {
29
+ return /* @__PURE__ */ jsxRuntime.jsx("path", {
30
30
  d: "M13 15h2v1h-1.5a.5.5 0 0 0 0 1H15v1h-1.5a.5.5 0 0 0 0 1H15v1h-1.5a.5.5 0 0 0 0 1h1a.5.5 0 0 0 .5-.5V20h1.5a.5.5 0 0 0 0-1H15v-1h1.5a.5.5 0 0 0 0-1H15v-1h1.5a.5.5 0 0 0 .5-.5V15a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2Z"
31
31
  });
32
32
  }
33
33
  if (mimeType.startsWith("text/") || mimeType.startsWith("font/") || mimeType.startsWith("application/")) {
34
- return /* @__PURE__ */ React.createElement("path", {
34
+ return /* @__PURE__ */ jsxRuntime.jsx("path", {
35
35
  d: "M10 16a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 0 1h-8a.5.5 0 0 1-.5-.5Z"
36
36
  });
37
37
  }
38
38
  if (mimeType.startsWith("image/")) {
39
- return /* @__PURE__ */ React.createElement("path", {
39
+ return /* @__PURE__ */ jsxRuntime.jsx("path", {
40
40
  d: "M12 16h6a1 1 0 0 1 1 1v3l-1.293-1.293a1 1 0 0 0-1.414 0L14.09 20.91l-.464-.386a1 1 0 0 0-1.265-.013l-1.231.985A.995.995 0 0 1 11 21v-4a1 1 0 0 1 1-1Zm-2 1a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-6a2 2 0 0 1-2-2v-4Zm3 2a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z"
41
41
  });
42
42
  }
43
43
  if (mimeType.startsWith("video/")) {
44
- return /* @__PURE__ */ React.createElement("path", {
44
+ return /* @__PURE__ */ jsxRuntime.jsx("path", {
45
45
  d: "M12 15.71a1 1 0 0 1 1.49-.872l4.96 2.79a1 1 0 0 1 0 1.744l-4.96 2.79A1 1 0 0 1 12 21.29v-5.58Z"
46
46
  });
47
47
  }
48
48
  if (mimeType.startsWith("audio/")) {
49
- return /* @__PURE__ */ React.createElement("path", {
49
+ return /* @__PURE__ */ jsxRuntime.jsx("path", {
50
50
  d: "M15 15a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 1 0v-7a.5.5 0 0 0-.5-.5Zm-2.5 2.5a.5.5 0 0 1 1 0v3a.5.5 0 0 1-1 0v-3Zm-2 1a.5.5 0 0 1 1 0v1a.5.5 0 0 1-1 0v-1Zm6-1a.5.5 0 0 1 1 0v3a.5.5 0 0 1-1 0v-3ZM19 16a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 1 0v-5a.5.5 0 0 0-.5-.5Z"
51
51
  });
52
52
  }
53
53
  return null;
54
54
  }
55
- const AttachmentFileIcon = React.memo(({ mimeType }) => {
56
- const iconGlyph = React.useMemo(() => getAttachmentIconGlyph(mimeType), [mimeType]);
57
- return /* @__PURE__ */ React.createElement("svg", {
55
+ const AttachmentFileIcon = react.memo(({ mimeType }) => {
56
+ const iconGlyph = react.useMemo(() => getAttachmentIconGlyph(mimeType), [mimeType]);
57
+ return /* @__PURE__ */ jsxRuntime.jsxs("svg", {
58
58
  className: "lb-attachment-icon",
59
59
  width: 30,
60
60
  height: 30,
@@ -62,19 +62,26 @@ const AttachmentFileIcon = React.memo(({ mimeType }) => {
62
62
  fill: "currentColor",
63
63
  fillRule: "evenodd",
64
64
  clipRule: "evenodd",
65
- xmlns: "http://www.w3.org/2000/svg"
66
- }, /* @__PURE__ */ React.createElement("path", {
67
- d: "M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z",
68
- className: "lb-attachment-icon-shadow"
69
- }), /* @__PURE__ */ React.createElement("path", {
70
- d: "M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z",
71
- className: "lb-attachment-icon-background"
72
- }), /* @__PURE__ */ React.createElement("path", {
73
- d: "M14.382 3.037a4 4 0 0 1 2.29 1.135l6.156 6.157a4 4 0 0 1 1.136 2.289A2 2 0 0 0 22 11h-4a2 2 0 0 1-2-2V5a2 2 0 0 0-1.618-1.963Z",
74
- className: "lb-attachment-icon-fold"
75
- }), iconGlyph && /* @__PURE__ */ React.createElement("g", {
76
- className: "lb-attachment-icon-glyph"
77
- }, iconGlyph));
65
+ xmlns: "http://www.w3.org/2000/svg",
66
+ children: [
67
+ /* @__PURE__ */ jsxRuntime.jsx("path", {
68
+ d: "M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z",
69
+ className: "lb-attachment-icon-shadow"
70
+ }),
71
+ /* @__PURE__ */ jsxRuntime.jsx("path", {
72
+ d: "M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z",
73
+ className: "lb-attachment-icon-background"
74
+ }),
75
+ /* @__PURE__ */ jsxRuntime.jsx("path", {
76
+ d: "M14.382 3.037a4 4 0 0 1 2.29 1.135l6.156 6.157a4 4 0 0 1 1.136 2.289A2 2 0 0 0 22 11h-4a2 2 0 0 1-2-2V5a2 2 0 0 0-1.618-1.963Z",
77
+ className: "lb-attachment-icon-fold"
78
+ }),
79
+ iconGlyph && /* @__PURE__ */ jsxRuntime.jsx("g", {
80
+ className: "lb-attachment-icon-glyph",
81
+ children: iconGlyph
82
+ })
83
+ ]
84
+ });
78
85
  });
79
86
  function AttachmentImagePreview({
80
87
  attachment,
@@ -82,19 +89,25 @@ function AttachmentImagePreview({
82
89
  roomId
83
90
  }) {
84
91
  const { url } = _private.useRoomAttachmentUrl(attachment.id, roomId);
85
- const [isLoaded, setLoaded] = React.useState(false);
86
- const handleLoad = React.useCallback(() => {
92
+ const [isLoaded, setLoaded] = react.useState(false);
93
+ const handleLoad = react.useCallback(() => {
87
94
  setLoaded(true);
88
95
  }, []);
89
- return /* @__PURE__ */ React.createElement(React.Fragment, null, !isLoaded ? /* @__PURE__ */ React.createElement(Spinner.SpinnerIcon, null) : null, url ? /* @__PURE__ */ React.createElement("div", {
90
- className: "lb-attachment-preview-media",
91
- "data-hidden": !isLoaded ? "" : void 0
92
- }, /* @__PURE__ */ React.createElement("img", {
93
- src: url,
94
- loading: "lazy",
95
- onLoad: handleLoad,
96
- onError: markPreviewAsUnsupported
97
- })) : null);
96
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
97
+ children: [
98
+ !isLoaded ? /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {}) : null,
99
+ url ? /* @__PURE__ */ jsxRuntime.jsx("div", {
100
+ className: "lb-attachment-preview-media",
101
+ "data-hidden": !isLoaded ? "" : void 0,
102
+ children: /* @__PURE__ */ jsxRuntime.jsx("img", {
103
+ src: url,
104
+ loading: "lazy",
105
+ onLoad: handleLoad,
106
+ onError: markPreviewAsUnsupported
107
+ })
108
+ }) : null
109
+ ]
110
+ });
98
111
  }
99
112
  function AttachmentVideoPreview({
100
113
  attachment,
@@ -102,66 +115,78 @@ function AttachmentVideoPreview({
102
115
  roomId
103
116
  }) {
104
117
  const { url } = _private.useRoomAttachmentUrl(attachment.id, roomId);
105
- const [isLoaded, setLoaded] = React.useState(false);
106
- const handleLoad = React.useCallback(() => {
118
+ const [isLoaded, setLoaded] = react.useState(false);
119
+ const handleLoad = react.useCallback(() => {
107
120
  setLoaded(true);
108
121
  }, []);
109
- return /* @__PURE__ */ React.createElement(React.Fragment, null, !isLoaded ? /* @__PURE__ */ React.createElement(Spinner.SpinnerIcon, null) : null, url ? /* @__PURE__ */ React.createElement("div", {
110
- className: "lb-attachment-preview-media",
111
- "data-hidden": !isLoaded ? "" : void 0
112
- }, /* @__PURE__ */ React.createElement("video", {
113
- src: url,
114
- onLoadedData: handleLoad,
115
- onError: markPreviewAsUnsupported
116
- })) : null);
122
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, {
123
+ children: [
124
+ !isLoaded ? /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {}) : null,
125
+ url ? /* @__PURE__ */ jsxRuntime.jsx("div", {
126
+ className: "lb-attachment-preview-media",
127
+ "data-hidden": !isLoaded ? "" : void 0,
128
+ children: /* @__PURE__ */ jsxRuntime.jsx("video", {
129
+ src: url,
130
+ onLoadedData: handleLoad,
131
+ onError: markPreviewAsUnsupported
132
+ })
133
+ }) : null
134
+ ]
135
+ });
117
136
  }
118
137
  function AttachmentPreview({
119
138
  attachment,
120
139
  allowMediaPreview = true,
121
140
  roomId
122
141
  }) {
123
- const [isUnsupportedPreview, setUnsupportedPreview] = React.useState(false);
142
+ const [isUnsupportedPreview, setUnsupportedPreview] = react.useState(false);
124
143
  const isUploaded = attachment.type === "attachment" || attachment.status === "uploaded";
125
144
  function markPreviewAsUnsupported() {
126
145
  setUnsupportedPreview(true);
127
146
  }
128
147
  if (!isUnsupportedPreview && allowMediaPreview && isUploaded && attachment.size <= MAX_DISPLAYED_MEDIA_SIZE) {
129
148
  if (attachment.mimeType.startsWith("image/")) {
130
- return /* @__PURE__ */ React.createElement(AttachmentImagePreview, {
149
+ return /* @__PURE__ */ jsxRuntime.jsx(AttachmentImagePreview, {
131
150
  attachment,
132
151
  markPreviewAsUnsupported,
133
152
  roomId
134
153
  });
135
154
  }
136
155
  if (attachment.mimeType.startsWith("video/")) {
137
- return /* @__PURE__ */ React.createElement(AttachmentVideoPreview, {
156
+ return /* @__PURE__ */ jsxRuntime.jsx(AttachmentVideoPreview, {
138
157
  attachment,
139
158
  markPreviewAsUnsupported,
140
159
  roomId
141
160
  });
142
161
  }
143
162
  }
144
- return /* @__PURE__ */ React.createElement(AttachmentFileIcon, {
163
+ return /* @__PURE__ */ jsxRuntime.jsx(AttachmentFileIcon, {
145
164
  mimeType: attachment.mimeType
146
165
  });
147
166
  }
148
167
  function AttachmentName({
149
168
  attachment
150
169
  }) {
151
- const { base: fileBaseName, extension: fileExtension } = React.useMemo(() => {
170
+ const { base: fileBaseName, extension: fileExtension } = react.useMemo(() => {
152
171
  return splitFileName(attachment.name);
153
172
  }, [attachment.name]);
154
- return /* @__PURE__ */ React.createElement("span", {
173
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", {
155
174
  className: "lb-attachment-name",
156
- title: attachment.name
157
- }, /* @__PURE__ */ React.createElement("span", {
158
- className: "lb-attachment-name-base"
159
- }, fileBaseName), fileExtension && /* @__PURE__ */ React.createElement("span", {
160
- className: "lb-attachment-name-extension"
161
- }, fileExtension));
175
+ title: attachment.name,
176
+ children: [
177
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
178
+ className: "lb-attachment-name-base",
179
+ children: fileBaseName
180
+ }),
181
+ fileExtension && /* @__PURE__ */ jsxRuntime.jsx("span", {
182
+ className: "lb-attachment-name-extension",
183
+ children: fileExtension
184
+ })
185
+ ]
186
+ });
162
187
  }
163
188
  function useClickOnKeyDown(onKeyDown) {
164
- const handleKeyDown = React.useCallback(
189
+ const handleKeyDown = react.useCallback(
165
190
  (event) => {
166
191
  onKeyDown?.(event);
167
192
  if (event.isDefaultPrevented()) {
@@ -226,7 +251,7 @@ function MediaAttachment({
226
251
  ...props
227
252
  }) {
228
253
  const { isUploading, isError, description, deleteLabel } = useAttachmentContent(attachment, overrides);
229
- const handleDeletePointerDown = React.useCallback(
254
+ const handleDeletePointerDown = react.useCallback(
230
255
  (event) => {
231
256
  if (preventFocusOnDelete) {
232
257
  event.preventDefault();
@@ -235,36 +260,49 @@ function MediaAttachment({
235
260
  [preventFocusOnDelete]
236
261
  );
237
262
  const handleKeyDown = useClickOnKeyDown(onKeyDown);
238
- return /* @__PURE__ */ React.createElement("div", {
263
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", {
239
264
  className: classNames.classNames("lb-attachment lb-media-attachment", className),
240
265
  "data-error": isError ? "" : void 0,
241
266
  ...props,
242
267
  role: onClick ? "button" : void 0,
243
268
  onClick,
244
269
  tabIndex: onClick ? 0 : -1,
245
- onKeyDown: onClick ? handleKeyDown : void 0
246
- }, /* @__PURE__ */ React.createElement("div", {
247
- className: "lb-attachment-preview"
248
- }, isUploading ? /* @__PURE__ */ React.createElement(Spinner.SpinnerIcon, null) : isError ? /* @__PURE__ */ React.createElement(Warning.WarningIcon, null) : /* @__PURE__ */ React.createElement(AttachmentPreview, {
249
- attachment,
250
- allowMediaPreview,
251
- roomId
252
- })), /* @__PURE__ */ React.createElement("div", {
253
- className: "lb-attachment-details"
254
- }, /* @__PURE__ */ React.createElement(AttachmentName, {
255
- attachment
256
- }), /* @__PURE__ */ React.createElement("span", {
257
- className: "lb-attachment-description",
258
- title: description
259
- }, description)), onDeleteClick && /* @__PURE__ */ React.createElement(Tooltip.Tooltip, {
260
- content: deleteLabel
261
- }, /* @__PURE__ */ React.createElement("button", {
262
- type: "button",
263
- className: "lb-attachment-delete",
264
- onClick: onDeleteClick,
265
- onPointerDown: handleDeletePointerDown,
266
- "aria-label": deleteLabel
267
- }, /* @__PURE__ */ React.createElement(Cross.CrossIcon, null))));
270
+ onKeyDown: onClick ? handleKeyDown : void 0,
271
+ children: [
272
+ /* @__PURE__ */ jsxRuntime.jsx("div", {
273
+ className: "lb-attachment-preview",
274
+ children: isUploading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {}) : isError ? /* @__PURE__ */ jsxRuntime.jsx(Warning.WarningIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(AttachmentPreview, {
275
+ attachment,
276
+ allowMediaPreview,
277
+ roomId
278
+ })
279
+ }),
280
+ /* @__PURE__ */ jsxRuntime.jsxs("div", {
281
+ className: "lb-attachment-details",
282
+ children: [
283
+ /* @__PURE__ */ jsxRuntime.jsx(AttachmentName, {
284
+ attachment
285
+ }),
286
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
287
+ className: "lb-attachment-description",
288
+ title: description,
289
+ children: description
290
+ })
291
+ ]
292
+ }),
293
+ onDeleteClick && /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, {
294
+ content: deleteLabel,
295
+ children: /* @__PURE__ */ jsxRuntime.jsx("button", {
296
+ type: "button",
297
+ className: "lb-attachment-delete",
298
+ onClick: onDeleteClick,
299
+ onPointerDown: handleDeletePointerDown,
300
+ "aria-label": deleteLabel,
301
+ children: /* @__PURE__ */ jsxRuntime.jsx(Cross.CrossIcon, {})
302
+ })
303
+ })
304
+ ]
305
+ });
268
306
  }
269
307
  function FileAttachment({
270
308
  attachment,
@@ -279,7 +317,7 @@ function FileAttachment({
279
317
  ...props
280
318
  }) {
281
319
  const { isUploading, isError, description, deleteLabel } = useAttachmentContent(attachment, overrides);
282
- const handleDeletePointerDown = React.useCallback(
320
+ const handleDeletePointerDown = react.useCallback(
283
321
  (event) => {
284
322
  if (preventFocusOnDelete) {
285
323
  event.preventDefault();
@@ -288,36 +326,49 @@ function FileAttachment({
288
326
  [preventFocusOnDelete]
289
327
  );
290
328
  const handleKeyDown = useClickOnKeyDown(onKeyDown);
291
- return /* @__PURE__ */ React.createElement("div", {
329
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", {
292
330
  className: classNames.classNames("lb-attachment lb-file-attachment", className),
293
331
  "data-error": isError ? "" : void 0,
294
332
  ...props,
295
333
  role: onClick ? "button" : void 0,
296
334
  onClick,
297
335
  tabIndex: onClick ? 0 : -1,
298
- onKeyDown: onClick ? handleKeyDown : void 0
299
- }, /* @__PURE__ */ React.createElement("div", {
300
- className: "lb-attachment-preview"
301
- }, isUploading ? /* @__PURE__ */ React.createElement(Spinner.SpinnerIcon, null) : isError ? /* @__PURE__ */ React.createElement(Warning.WarningIcon, null) : /* @__PURE__ */ React.createElement(AttachmentPreview, {
302
- attachment,
303
- allowMediaPreview,
304
- roomId
305
- })), /* @__PURE__ */ React.createElement("div", {
306
- className: "lb-attachment-details"
307
- }, /* @__PURE__ */ React.createElement(AttachmentName, {
308
- attachment
309
- }), /* @__PURE__ */ React.createElement("span", {
310
- className: "lb-attachment-description",
311
- title: description
312
- }, description)), onDeleteClick && /* @__PURE__ */ React.createElement(Tooltip.Tooltip, {
313
- content: deleteLabel
314
- }, /* @__PURE__ */ React.createElement("button", {
315
- type: "button",
316
- className: "lb-attachment-delete",
317
- onClick: onDeleteClick,
318
- onPointerDown: handleDeletePointerDown,
319
- "aria-label": deleteLabel
320
- }, /* @__PURE__ */ React.createElement(Cross.CrossIcon, null))));
336
+ onKeyDown: onClick ? handleKeyDown : void 0,
337
+ children: [
338
+ /* @__PURE__ */ jsxRuntime.jsx("div", {
339
+ className: "lb-attachment-preview",
340
+ children: isUploading ? /* @__PURE__ */ jsxRuntime.jsx(Spinner.SpinnerIcon, {}) : isError ? /* @__PURE__ */ jsxRuntime.jsx(Warning.WarningIcon, {}) : /* @__PURE__ */ jsxRuntime.jsx(AttachmentPreview, {
341
+ attachment,
342
+ allowMediaPreview,
343
+ roomId
344
+ })
345
+ }),
346
+ /* @__PURE__ */ jsxRuntime.jsxs("div", {
347
+ className: "lb-attachment-details",
348
+ children: [
349
+ /* @__PURE__ */ jsxRuntime.jsx(AttachmentName, {
350
+ attachment
351
+ }),
352
+ /* @__PURE__ */ jsxRuntime.jsx("span", {
353
+ className: "lb-attachment-description",
354
+ title: description,
355
+ children: description
356
+ })
357
+ ]
358
+ }),
359
+ onDeleteClick && /* @__PURE__ */ jsxRuntime.jsx(Tooltip.Tooltip, {
360
+ content: deleteLabel,
361
+ children: /* @__PURE__ */ jsxRuntime.jsx("button", {
362
+ type: "button",
363
+ className: "lb-attachment-delete",
364
+ onClick: onDeleteClick,
365
+ onPointerDown: handleDeletePointerDown,
366
+ "aria-label": deleteLabel,
367
+ children: /* @__PURE__ */ jsxRuntime.jsx(Cross.CrossIcon, {})
368
+ })
369
+ })
370
+ ]
371
+ });
321
372
  }
322
373
  function separateMediaAttachments(attachments) {
323
374
  const mediaAttachments = [];
@@ -1 +1 @@
1
- {"version":3,"file":"Attachment.js","sources":["../../../src/components/internal/Attachment.tsx"],"sourcesContent":["\"use client\";\n\nimport type { CommentMixedAttachment } from \"@liveblocks/core\";\nimport { useRoomAttachmentUrl } from \"@liveblocks/react/_private\";\nimport type {\n ComponentPropsWithoutRef,\n KeyboardEvent,\n MouseEventHandler,\n PointerEvent,\n} from \"react\";\nimport React, { memo, useCallback, useMemo, useState } from \"react\";\n\nimport { CrossIcon } from \"../../icons/Cross\";\nimport { SpinnerIcon } from \"../../icons/Spinner\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport type { Overrides } from \"../../overrides\";\nimport { useOverrides } from \"../../overrides\";\nimport { AttachmentTooLargeError } from \"../../primitives\";\nimport { useComposerAttachmentsContextOrNull } from \"../../primitives/Composer/contexts\";\nimport { classNames } from \"../../utils/class-names\";\nimport { formatFileSize } from \"../../utils/format-file-size\";\nimport { Tooltip } from \"./Tooltip\";\n\nconst MAX_DISPLAYED_MEDIA_SIZE = 60 * 1024 * 1024; // 60 MB\n\ninterface AttachmentProps extends ComponentPropsWithoutRef<\"div\"> {\n attachment: CommentMixedAttachment;\n onDeleteClick?: MouseEventHandler<HTMLButtonElement>;\n preventFocusOnDelete?: boolean;\n roomId: string;\n overrides?: Partial<Overrides>;\n allowMediaPreview?: boolean;\n}\n\nconst fileExtensionRegex = /^(.+?)(\\.[^.]+)?$/;\n\nfunction splitFileName(name: string) {\n const match = name.match(fileExtensionRegex);\n\n return { base: match?.[1] ?? name, extension: match?.[2] };\n}\n\nfunction getAttachmentIconGlyph(mimeType: string) {\n if (\n mimeType === \"application/zip\" ||\n mimeType === \"application/gzip\" ||\n mimeType === \"application/vnd.rar\" ||\n mimeType === \"application/x-rar-compressed\" ||\n mimeType === \"application/x-7z-compressed\" ||\n mimeType === \"application/x-zip-compressed\" ||\n mimeType === \"application/x-tar\" ||\n mimeType === \"application/x-bzip\" ||\n mimeType === \"application/x-bzip2\"\n ) {\n return (\n <path d=\"M13 15h2v1h-1.5a.5.5 0 0 0 0 1H15v1h-1.5a.5.5 0 0 0 0 1H15v1h-1.5a.5.5 0 0 0 0 1h1a.5.5 0 0 0 .5-.5V20h1.5a.5.5 0 0 0 0-1H15v-1h1.5a.5.5 0 0 0 0-1H15v-1h1.5a.5.5 0 0 0 .5-.5V15a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2Z\" />\n );\n }\n\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType.startsWith(\"font/\") ||\n mimeType.startsWith(\"application/\")\n ) {\n return (\n <path d=\"M10 16a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 0 1h-8a.5.5 0 0 1-.5-.5Z\" />\n );\n }\n\n if (mimeType.startsWith(\"image/\")) {\n return (\n <path d=\"M12 16h6a1 1 0 0 1 1 1v3l-1.293-1.293a1 1 0 0 0-1.414 0L14.09 20.91l-.464-.386a1 1 0 0 0-1.265-.013l-1.231.985A.995.995 0 0 1 11 21v-4a1 1 0 0 1 1-1Zm-2 1a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-6a2 2 0 0 1-2-2v-4Zm3 2a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" />\n );\n }\n\n if (mimeType.startsWith(\"video/\")) {\n return (\n <path d=\"M12 15.71a1 1 0 0 1 1.49-.872l4.96 2.79a1 1 0 0 1 0 1.744l-4.96 2.79A1 1 0 0 1 12 21.29v-5.58Z\" />\n );\n }\n\n if (mimeType.startsWith(\"audio/\")) {\n return (\n <path d=\"M15 15a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 1 0v-7a.5.5 0 0 0-.5-.5Zm-2.5 2.5a.5.5 0 0 1 1 0v3a.5.5 0 0 1-1 0v-3Zm-2 1a.5.5 0 0 1 1 0v1a.5.5 0 0 1-1 0v-1Zm6-1a.5.5 0 0 1 1 0v3a.5.5 0 0 1-1 0v-3ZM19 16a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 1 0v-5a.5.5 0 0 0-.5-.5Z\" />\n );\n }\n\n return null;\n}\n\nconst AttachmentFileIcon = memo(({ mimeType }: { mimeType: string }) => {\n const iconGlyph = useMemo(() => getAttachmentIconGlyph(mimeType), [mimeType]);\n\n return (\n <svg\n className=\"lb-attachment-icon\"\n width={30}\n height={30}\n viewBox=\"0 0 30 30\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z\"\n className=\"lb-attachment-icon-shadow\"\n />\n <path\n d=\"M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z\"\n className=\"lb-attachment-icon-background\"\n />\n <path\n d=\"M14.382 3.037a4 4 0 0 1 2.29 1.135l6.156 6.157a4 4 0 0 1 1.136 2.289A2 2 0 0 0 22 11h-4a2 2 0 0 1-2-2V5a2 2 0 0 0-1.618-1.963Z\"\n className=\"lb-attachment-icon-fold\"\n />\n\n {iconGlyph && <g className=\"lb-attachment-icon-glyph\">{iconGlyph}</g>}\n </svg>\n );\n});\n\nfunction AttachmentImagePreview({\n attachment,\n markPreviewAsUnsupported,\n roomId,\n}: {\n attachment: CommentMixedAttachment;\n markPreviewAsUnsupported: () => void;\n roomId: string;\n}) {\n const { url } = useRoomAttachmentUrl(attachment.id, roomId);\n const [isLoaded, setLoaded] = useState(false);\n\n const handleLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n return (\n <>\n {!isLoaded ? <SpinnerIcon /> : null}\n {url ? (\n <div\n className=\"lb-attachment-preview-media\"\n data-hidden={!isLoaded ? \"\" : undefined}\n >\n <img\n src={url}\n loading=\"lazy\"\n onLoad={handleLoad}\n onError={markPreviewAsUnsupported}\n />\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AttachmentVideoPreview({\n attachment,\n markPreviewAsUnsupported,\n roomId,\n}: {\n attachment: CommentMixedAttachment;\n markPreviewAsUnsupported: () => void;\n roomId: string;\n}) {\n const { url } = useRoomAttachmentUrl(attachment.id, roomId);\n const [isLoaded, setLoaded] = useState(false);\n\n const handleLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n return (\n <>\n {!isLoaded ? <SpinnerIcon /> : null}\n {url ? (\n <div\n className=\"lb-attachment-preview-media\"\n data-hidden={!isLoaded ? \"\" : undefined}\n >\n <video\n src={url}\n onLoadedData={handleLoad}\n onError={markPreviewAsUnsupported}\n />\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AttachmentPreview({\n attachment,\n allowMediaPreview = true,\n roomId,\n}: {\n attachment: CommentMixedAttachment;\n allowMediaPreview?: boolean;\n roomId: string;\n}) {\n const [isUnsupportedPreview, setUnsupportedPreview] = useState(false);\n const isUploaded =\n attachment.type === \"attachment\" || attachment.status === \"uploaded\";\n\n function markPreviewAsUnsupported() {\n setUnsupportedPreview(true);\n }\n\n if (\n !isUnsupportedPreview &&\n allowMediaPreview &&\n isUploaded &&\n attachment.size <= MAX_DISPLAYED_MEDIA_SIZE\n ) {\n if (attachment.mimeType.startsWith(\"image/\")) {\n return (\n <AttachmentImagePreview\n attachment={attachment}\n markPreviewAsUnsupported={markPreviewAsUnsupported}\n roomId={roomId}\n />\n );\n }\n\n if (attachment.mimeType.startsWith(\"video/\")) {\n return (\n <AttachmentVideoPreview\n attachment={attachment}\n markPreviewAsUnsupported={markPreviewAsUnsupported}\n roomId={roomId}\n />\n );\n }\n }\n\n return <AttachmentFileIcon mimeType={attachment.mimeType} />;\n}\n\nfunction AttachmentName({\n attachment,\n}: {\n attachment: CommentMixedAttachment;\n}) {\n const { base: fileBaseName, extension: fileExtension } = useMemo(() => {\n return splitFileName(attachment.name);\n }, [attachment.name]);\n\n return (\n <span className=\"lb-attachment-name\" title={attachment.name}>\n <span className=\"lb-attachment-name-base\">{fileBaseName}</span>\n {fileExtension && (\n <span className=\"lb-attachment-name-extension\">{fileExtension}</span>\n )}\n </span>\n );\n}\n\nfunction useClickOnKeyDown(\n onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void\n) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n // Simulate a click event on Enter or Space because it's a div\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n\n const clickEvent = new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n view: window,\n });\n event.target.dispatchEvent(clickEvent);\n }\n },\n [onKeyDown]\n );\n\n return handleKeyDown;\n}\n\nfunction useAttachmentContent(\n attachment: CommentMixedAttachment,\n overrides?: Partial<Overrides>\n) {\n const $ = useOverrides(overrides);\n const composerAttachmentsContext = useComposerAttachmentsContextOrNull();\n const isInComposer = Boolean(composerAttachmentsContext);\n const maxAttachmentSize = composerAttachmentsContext?.maxAttachmentSize;\n\n const status =\n attachment.type === \"localAttachment\" ? attachment.status : undefined;\n const isUploading = status === \"uploading\";\n const isError = status === \"error\";\n\n let description: string;\n\n if (attachment.type === \"localAttachment\" && attachment.status === \"error\") {\n if (attachment.error instanceof AttachmentTooLargeError) {\n if (attachment.error.origin === \"server\") {\n description = $.ATTACHMENT_TOO_LARGE();\n } else {\n description = $.ATTACHMENT_TOO_LARGE(\n maxAttachmentSize\n ? formatFileSize(maxAttachmentSize, $.locale)\n : undefined\n );\n }\n } else {\n description = $.ATTACHMENT_ERROR(attachment.error);\n }\n } else {\n description = formatFileSize(attachment.size, $.locale);\n }\n\n const deleteLabel = isInComposer\n ? $.COMPOSER_REMOVE_ATTACHMENT\n : $.COMMENT_DELETE_ATTACHMENT;\n\n return {\n isUploading,\n isError,\n description,\n deleteLabel,\n };\n}\n\nexport function MediaAttachment({\n attachment,\n overrides,\n onClick,\n onDeleteClick,\n preventFocusOnDelete,\n allowMediaPreview = true,\n roomId,\n className,\n onKeyDown,\n ...props\n}: AttachmentProps) {\n const { isUploading, isError, description, deleteLabel } =\n useAttachmentContent(attachment, overrides);\n\n const handleDeletePointerDown = useCallback(\n (event: PointerEvent<HTMLButtonElement>) => {\n if (preventFocusOnDelete) {\n event.preventDefault();\n }\n },\n [preventFocusOnDelete]\n );\n\n const handleKeyDown = useClickOnKeyDown(onKeyDown);\n\n return (\n <div\n className={classNames(\"lb-attachment lb-media-attachment\", className)}\n data-error={isError ? \"\" : undefined}\n {...props}\n role={onClick ? \"button\" : undefined}\n onClick={onClick}\n tabIndex={onClick ? 0 : -1}\n onKeyDown={onClick ? handleKeyDown : undefined}\n >\n <div className=\"lb-attachment-preview\">\n {isUploading ? (\n <SpinnerIcon />\n ) : isError ? (\n <WarningIcon />\n ) : (\n <AttachmentPreview\n attachment={attachment}\n allowMediaPreview={allowMediaPreview}\n roomId={roomId}\n />\n )}\n </div>\n <div className=\"lb-attachment-details\">\n <AttachmentName attachment={attachment} />\n <span className=\"lb-attachment-description\" title={description}>\n {description}\n </span>\n </div>\n {onDeleteClick && (\n <Tooltip content={deleteLabel}>\n <button\n type=\"button\"\n className=\"lb-attachment-delete\"\n onClick={onDeleteClick}\n onPointerDown={handleDeletePointerDown}\n aria-label={deleteLabel}\n >\n <CrossIcon />\n </button>\n </Tooltip>\n )}\n </div>\n );\n}\n\nexport function FileAttachment({\n attachment,\n overrides,\n onClick,\n onDeleteClick,\n preventFocusOnDelete,\n allowMediaPreview = true,\n roomId,\n className,\n onKeyDown,\n ...props\n}: AttachmentProps) {\n const { isUploading, isError, description, deleteLabel } =\n useAttachmentContent(attachment, overrides);\n\n const handleDeletePointerDown = useCallback(\n (event: PointerEvent<HTMLButtonElement>) => {\n if (preventFocusOnDelete) {\n event.preventDefault();\n }\n },\n [preventFocusOnDelete]\n );\n\n const handleKeyDown = useClickOnKeyDown(onKeyDown);\n\n return (\n <div\n className={classNames(\"lb-attachment lb-file-attachment\", className)}\n data-error={isError ? \"\" : undefined}\n {...props}\n role={onClick ? \"button\" : undefined}\n onClick={onClick}\n tabIndex={onClick ? 0 : -1}\n onKeyDown={onClick ? handleKeyDown : undefined}\n >\n <div className=\"lb-attachment-preview\">\n {isUploading ? (\n <SpinnerIcon />\n ) : isError ? (\n <WarningIcon />\n ) : (\n <AttachmentPreview\n attachment={attachment}\n allowMediaPreview={allowMediaPreview}\n roomId={roomId}\n />\n )}\n </div>\n <div className=\"lb-attachment-details\">\n <AttachmentName attachment={attachment} />\n <span className=\"lb-attachment-description\" title={description}>\n {description}\n </span>\n </div>\n {onDeleteClick && (\n <Tooltip content={deleteLabel}>\n <button\n type=\"button\"\n className=\"lb-attachment-delete\"\n onClick={onDeleteClick}\n onPointerDown={handleDeletePointerDown}\n aria-label={deleteLabel}\n >\n <CrossIcon />\n </button>\n </Tooltip>\n )}\n </div>\n );\n}\n\nexport function separateMediaAttachments<T extends CommentMixedAttachment>(\n attachments: T[]\n) {\n const mediaAttachments: T[] = [];\n const fileAttachments: T[] = [];\n\n for (const attachment of attachments) {\n if (\n (attachment.mimeType.startsWith(\"image/\") ||\n attachment.mimeType.startsWith(\"video/\")) &&\n attachment.size <= MAX_DISPLAYED_MEDIA_SIZE\n ) {\n mediaAttachments.push(attachment);\n } else {\n fileAttachments.push(attachment);\n }\n }\n\n return {\n mediaAttachments,\n fileAttachments,\n };\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA;AAWA;AAEA;AACE;AAEA;AACF;AAEA;AACE;AAWE;AACG;AAAO;AAAoP;AAIhQ;AAKE;AACG;AAAO;AAAiP;AAI7P;AACE;AACG;AAAO;AAAiQ;AAI7Q;AACE;AACG;AAAO;AAAiG;AAI7G;AACE;AACG;AAAO;AAAyP;AAIrQ;AACF;AAEA;AACE;AAEA;AACG;AACW;AACH;AACC;AACA;AACH;AACI;AACA;AACH;AAEL;AACG;AACQ;AAEX;AACG;AACQ;AAEX;AACG;AACQ;AAGG;AAAY;AAGjC;AAEA;AAAgC;AAC9B;AACA;AAEF;AAKE;AACA;AAEA;AACE;AAAc;AAGhB;AAIO;AACW;AACoB;AAE7B;AACM;AACG;AACA;AACC;AAMrB;AAEA;AAAgC;AAC9B;AACA;AAEF;AAKE;AACA;AAEA;AACE;AAAc;AAGhB;AAIO;AACW;AACoB;AAE7B;AACM;AACS;AACL;AAMrB;AAEA;AAA2B;AACzB;AACoB;AAEtB;AAKE;AACA;AAGA;AACE;AAA0B;AAG5B;AAME;AACE;AACG;AACC;AACA;AACA;AACF;AAIJ;AACE;AACG;AACC;AACA;AACA;AACF;AAEJ;AAGF;AAAQ;AAAwC;AAClD;AAEA;AAAwB;AAExB;AAGE;AACE;AAAoC;AAGtC;AACG;AAAe;AAAuC;AACpD;AAAe;AAEb;AAAe;AAIxB;AAEA;AAGE;AAAsB;AAElB;AAEA;AACE;AAAA;AAIF;AACE;AAEA;AAA2C;AAChC;AACG;AACN;AAER;AAAqC;AACvC;AACF;AACU;AAGZ;AACF;AAEA;AAIE;AACA;AACA;AACA;AAEA;AAEA;AACA;AAEA;AAEA;AACE;AACE;AACE;AAAqC;AAErC;AAAgB;AAGV;AACN;AACF;AAEA;AAAiD;AACnD;AAEA;AAAsD;AAGxD;AAIA;AAAO;AACL;AACA;AACA;AACA;AAEJ;AAEO;AAAyB;AAC9B;AACA;AACA;AACA;AACA;AACoB;AACpB;AACA;AACA;AAEF;AACE;AAGA;AAAgC;AAE5B;AACE;AAAqB;AACvB;AACF;AACqB;AAGvB;AAEA;AACG;AACqE;AACzC;AACvB;AACuB;AAC3B;AACwB;AACa;AAEpC;AAAc;AAMV;AACC;AACA;AACA;AAIL;AAAc;AACZ;AAAe;AACf;AAAe;AAAmC;AAKlD;AAAiB;AACf;AACM;AACK;AACD;AACM;AACH;AAQxB;AAEO;AAAwB;AAC7B;AACA;AACA;AACA;AACA;AACoB;AACpB;AACA;AACA;AAEF;AACE;AAGA;AAAgC;AAE5B;AACE;AAAqB;AACvB;AACF;AACqB;AAGvB;AAEA;AACG;AACoE;AACxC;AACvB;AACuB;AAC3B;AACwB;AACa;AAEpC;AAAc;AAMV;AACC;AACA;AACA;AAIL;AAAc;AACZ;AAAe;AACf;AAAe;AAAmC;AAKlD;AAAiB;AACf;AACM;AACK;AACD;AACM;AACH;AAQxB;AAEO;AAGL;AACA;AAEA;AACE;AAKE;AAAgC;AAEhC;AAA+B;AACjC;AAGF;AAAO;AACL;AACA;AAEJ;;;;"}
1
+ {"version":3,"file":"Attachment.js","sources":["../../../src/components/internal/Attachment.tsx"],"sourcesContent":["\"use client\";\n\nimport type { CommentMixedAttachment } from \"@liveblocks/core\";\nimport { useRoomAttachmentUrl } from \"@liveblocks/react/_private\";\nimport type {\n ComponentPropsWithoutRef,\n KeyboardEvent,\n MouseEventHandler,\n PointerEvent,\n} from \"react\";\nimport { memo, useCallback, useMemo, useState } from \"react\";\n\nimport { CrossIcon } from \"../../icons/Cross\";\nimport { SpinnerIcon } from \"../../icons/Spinner\";\nimport { WarningIcon } from \"../../icons/Warning\";\nimport type { Overrides } from \"../../overrides\";\nimport { useOverrides } from \"../../overrides\";\nimport { AttachmentTooLargeError } from \"../../primitives\";\nimport { useComposerAttachmentsContextOrNull } from \"../../primitives/Composer/contexts\";\nimport { classNames } from \"../../utils/class-names\";\nimport { formatFileSize } from \"../../utils/format-file-size\";\nimport { Tooltip } from \"./Tooltip\";\n\nconst MAX_DISPLAYED_MEDIA_SIZE = 60 * 1024 * 1024; // 60 MB\n\ninterface AttachmentProps extends ComponentPropsWithoutRef<\"div\"> {\n attachment: CommentMixedAttachment;\n onDeleteClick?: MouseEventHandler<HTMLButtonElement>;\n preventFocusOnDelete?: boolean;\n roomId: string;\n overrides?: Partial<Overrides>;\n allowMediaPreview?: boolean;\n}\n\nconst fileExtensionRegex = /^(.+?)(\\.[^.]+)?$/;\n\nfunction splitFileName(name: string) {\n const match = name.match(fileExtensionRegex);\n\n return { base: match?.[1] ?? name, extension: match?.[2] };\n}\n\nfunction getAttachmentIconGlyph(mimeType: string) {\n if (\n mimeType === \"application/zip\" ||\n mimeType === \"application/gzip\" ||\n mimeType === \"application/vnd.rar\" ||\n mimeType === \"application/x-rar-compressed\" ||\n mimeType === \"application/x-7z-compressed\" ||\n mimeType === \"application/x-zip-compressed\" ||\n mimeType === \"application/x-tar\" ||\n mimeType === \"application/x-bzip\" ||\n mimeType === \"application/x-bzip2\"\n ) {\n return (\n <path d=\"M13 15h2v1h-1.5a.5.5 0 0 0 0 1H15v1h-1.5a.5.5 0 0 0 0 1H15v1h-1.5a.5.5 0 0 0 0 1h1a.5.5 0 0 0 .5-.5V20h1.5a.5.5 0 0 0 0-1H15v-1h1.5a.5.5 0 0 0 0-1H15v-1h1.5a.5.5 0 0 0 .5-.5V15a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-4a2 2 0 0 1-2-2v-4a2 2 0 0 1 2-2Z\" />\n );\n }\n\n if (\n mimeType.startsWith(\"text/\") ||\n mimeType.startsWith(\"font/\") ||\n mimeType.startsWith(\"application/\")\n ) {\n return (\n <path d=\"M10 16a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h8a.5.5 0 0 1 0 1h-8a.5.5 0 0 1-.5-.5Z\" />\n );\n }\n\n if (mimeType.startsWith(\"image/\")) {\n return (\n <path d=\"M12 16h6a1 1 0 0 1 1 1v3l-1.293-1.293a1 1 0 0 0-1.414 0L14.09 20.91l-.464-.386a1 1 0 0 0-1.265-.013l-1.231.985A.995.995 0 0 1 11 21v-4a1 1 0 0 1 1-1Zm-2 1a2 2 0 0 1 2-2h6a2 2 0 0 1 2 2v4a2 2 0 0 1-2 2h-6a2 2 0 0 1-2-2v-4Zm3 2a1 1 0 1 0 0-2 1 1 0 0 0 0 2Z\" />\n );\n }\n\n if (mimeType.startsWith(\"video/\")) {\n return (\n <path d=\"M12 15.71a1 1 0 0 1 1.49-.872l4.96 2.79a1 1 0 0 1 0 1.744l-4.96 2.79A1 1 0 0 1 12 21.29v-5.58Z\" />\n );\n }\n\n if (mimeType.startsWith(\"audio/\")) {\n return (\n <path d=\"M15 15a.5.5 0 0 0-.5.5v7a.5.5 0 0 0 1 0v-7a.5.5 0 0 0-.5-.5Zm-2.5 2.5a.5.5 0 0 1 1 0v3a.5.5 0 0 1-1 0v-3Zm-2 1a.5.5 0 0 1 1 0v1a.5.5 0 0 1-1 0v-1Zm6-1a.5.5 0 0 1 1 0v3a.5.5 0 0 1-1 0v-3ZM19 16a.5.5 0 0 0-.5.5v5a.5.5 0 0 0 1 0v-5a.5.5 0 0 0-.5-.5Z\" />\n );\n }\n\n return null;\n}\n\nconst AttachmentFileIcon = memo(({ mimeType }: { mimeType: string }) => {\n const iconGlyph = useMemo(() => getAttachmentIconGlyph(mimeType), [mimeType]);\n\n return (\n <svg\n className=\"lb-attachment-icon\"\n width={30}\n height={30}\n viewBox=\"0 0 30 30\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z\"\n className=\"lb-attachment-icon-shadow\"\n />\n <path\n d=\"M6 5a2 2 0 0 1 2-2h5.843a4 4 0 0 1 2.829 1.172l6.156 6.156A4 4 0 0 1 24 13.157V25a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2V5Z\"\n className=\"lb-attachment-icon-background\"\n />\n <path\n d=\"M14.382 3.037a4 4 0 0 1 2.29 1.135l6.156 6.157a4 4 0 0 1 1.136 2.289A2 2 0 0 0 22 11h-4a2 2 0 0 1-2-2V5a2 2 0 0 0-1.618-1.963Z\"\n className=\"lb-attachment-icon-fold\"\n />\n\n {iconGlyph && <g className=\"lb-attachment-icon-glyph\">{iconGlyph}</g>}\n </svg>\n );\n});\n\nfunction AttachmentImagePreview({\n attachment,\n markPreviewAsUnsupported,\n roomId,\n}: {\n attachment: CommentMixedAttachment;\n markPreviewAsUnsupported: () => void;\n roomId: string;\n}) {\n const { url } = useRoomAttachmentUrl(attachment.id, roomId);\n const [isLoaded, setLoaded] = useState(false);\n\n const handleLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n return (\n <>\n {!isLoaded ? <SpinnerIcon /> : null}\n {url ? (\n <div\n className=\"lb-attachment-preview-media\"\n data-hidden={!isLoaded ? \"\" : undefined}\n >\n <img\n src={url}\n loading=\"lazy\"\n onLoad={handleLoad}\n onError={markPreviewAsUnsupported}\n />\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AttachmentVideoPreview({\n attachment,\n markPreviewAsUnsupported,\n roomId,\n}: {\n attachment: CommentMixedAttachment;\n markPreviewAsUnsupported: () => void;\n roomId: string;\n}) {\n const { url } = useRoomAttachmentUrl(attachment.id, roomId);\n const [isLoaded, setLoaded] = useState(false);\n\n const handleLoad = useCallback(() => {\n setLoaded(true);\n }, []);\n\n return (\n <>\n {!isLoaded ? <SpinnerIcon /> : null}\n {url ? (\n <div\n className=\"lb-attachment-preview-media\"\n data-hidden={!isLoaded ? \"\" : undefined}\n >\n <video\n src={url}\n onLoadedData={handleLoad}\n onError={markPreviewAsUnsupported}\n />\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AttachmentPreview({\n attachment,\n allowMediaPreview = true,\n roomId,\n}: {\n attachment: CommentMixedAttachment;\n allowMediaPreview?: boolean;\n roomId: string;\n}) {\n const [isUnsupportedPreview, setUnsupportedPreview] = useState(false);\n const isUploaded =\n attachment.type === \"attachment\" || attachment.status === \"uploaded\";\n\n function markPreviewAsUnsupported() {\n setUnsupportedPreview(true);\n }\n\n if (\n !isUnsupportedPreview &&\n allowMediaPreview &&\n isUploaded &&\n attachment.size <= MAX_DISPLAYED_MEDIA_SIZE\n ) {\n if (attachment.mimeType.startsWith(\"image/\")) {\n return (\n <AttachmentImagePreview\n attachment={attachment}\n markPreviewAsUnsupported={markPreviewAsUnsupported}\n roomId={roomId}\n />\n );\n }\n\n if (attachment.mimeType.startsWith(\"video/\")) {\n return (\n <AttachmentVideoPreview\n attachment={attachment}\n markPreviewAsUnsupported={markPreviewAsUnsupported}\n roomId={roomId}\n />\n );\n }\n }\n\n return <AttachmentFileIcon mimeType={attachment.mimeType} />;\n}\n\nfunction AttachmentName({\n attachment,\n}: {\n attachment: CommentMixedAttachment;\n}) {\n const { base: fileBaseName, extension: fileExtension } = useMemo(() => {\n return splitFileName(attachment.name);\n }, [attachment.name]);\n\n return (\n <span className=\"lb-attachment-name\" title={attachment.name}>\n <span className=\"lb-attachment-name-base\">{fileBaseName}</span>\n {fileExtension && (\n <span className=\"lb-attachment-name-extension\">{fileExtension}</span>\n )}\n </span>\n );\n}\n\nfunction useClickOnKeyDown(\n onKeyDown?: (event: KeyboardEvent<HTMLDivElement>) => void\n) {\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n // Simulate a click event on Enter or Space because it's a div\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n\n const clickEvent = new MouseEvent(\"click\", {\n bubbles: true,\n cancelable: true,\n view: window,\n });\n event.target.dispatchEvent(clickEvent);\n }\n },\n [onKeyDown]\n );\n\n return handleKeyDown;\n}\n\nfunction useAttachmentContent(\n attachment: CommentMixedAttachment,\n overrides?: Partial<Overrides>\n) {\n const $ = useOverrides(overrides);\n const composerAttachmentsContext = useComposerAttachmentsContextOrNull();\n const isInComposer = Boolean(composerAttachmentsContext);\n const maxAttachmentSize = composerAttachmentsContext?.maxAttachmentSize;\n\n const status =\n attachment.type === \"localAttachment\" ? attachment.status : undefined;\n const isUploading = status === \"uploading\";\n const isError = status === \"error\";\n\n let description: string;\n\n if (attachment.type === \"localAttachment\" && attachment.status === \"error\") {\n if (attachment.error instanceof AttachmentTooLargeError) {\n if (attachment.error.origin === \"server\") {\n description = $.ATTACHMENT_TOO_LARGE();\n } else {\n description = $.ATTACHMENT_TOO_LARGE(\n maxAttachmentSize\n ? formatFileSize(maxAttachmentSize, $.locale)\n : undefined\n );\n }\n } else {\n description = $.ATTACHMENT_ERROR(attachment.error);\n }\n } else {\n description = formatFileSize(attachment.size, $.locale);\n }\n\n const deleteLabel = isInComposer\n ? $.COMPOSER_REMOVE_ATTACHMENT\n : $.COMMENT_DELETE_ATTACHMENT;\n\n return {\n isUploading,\n isError,\n description,\n deleteLabel,\n };\n}\n\nexport function MediaAttachment({\n attachment,\n overrides,\n onClick,\n onDeleteClick,\n preventFocusOnDelete,\n allowMediaPreview = true,\n roomId,\n className,\n onKeyDown,\n ...props\n}: AttachmentProps) {\n const { isUploading, isError, description, deleteLabel } =\n useAttachmentContent(attachment, overrides);\n\n const handleDeletePointerDown = useCallback(\n (event: PointerEvent<HTMLButtonElement>) => {\n if (preventFocusOnDelete) {\n event.preventDefault();\n }\n },\n [preventFocusOnDelete]\n );\n\n const handleKeyDown = useClickOnKeyDown(onKeyDown);\n\n return (\n <div\n className={classNames(\"lb-attachment lb-media-attachment\", className)}\n data-error={isError ? \"\" : undefined}\n {...props}\n role={onClick ? \"button\" : undefined}\n onClick={onClick}\n tabIndex={onClick ? 0 : -1}\n onKeyDown={onClick ? handleKeyDown : undefined}\n >\n <div className=\"lb-attachment-preview\">\n {isUploading ? (\n <SpinnerIcon />\n ) : isError ? (\n <WarningIcon />\n ) : (\n <AttachmentPreview\n attachment={attachment}\n allowMediaPreview={allowMediaPreview}\n roomId={roomId}\n />\n )}\n </div>\n <div className=\"lb-attachment-details\">\n <AttachmentName attachment={attachment} />\n <span className=\"lb-attachment-description\" title={description}>\n {description}\n </span>\n </div>\n {onDeleteClick && (\n <Tooltip content={deleteLabel}>\n <button\n type=\"button\"\n className=\"lb-attachment-delete\"\n onClick={onDeleteClick}\n onPointerDown={handleDeletePointerDown}\n aria-label={deleteLabel}\n >\n <CrossIcon />\n </button>\n </Tooltip>\n )}\n </div>\n );\n}\n\nexport function FileAttachment({\n attachment,\n overrides,\n onClick,\n onDeleteClick,\n preventFocusOnDelete,\n allowMediaPreview = true,\n roomId,\n className,\n onKeyDown,\n ...props\n}: AttachmentProps) {\n const { isUploading, isError, description, deleteLabel } =\n useAttachmentContent(attachment, overrides);\n\n const handleDeletePointerDown = useCallback(\n (event: PointerEvent<HTMLButtonElement>) => {\n if (preventFocusOnDelete) {\n event.preventDefault();\n }\n },\n [preventFocusOnDelete]\n );\n\n const handleKeyDown = useClickOnKeyDown(onKeyDown);\n\n return (\n <div\n className={classNames(\"lb-attachment lb-file-attachment\", className)}\n data-error={isError ? \"\" : undefined}\n {...props}\n role={onClick ? \"button\" : undefined}\n onClick={onClick}\n tabIndex={onClick ? 0 : -1}\n onKeyDown={onClick ? handleKeyDown : undefined}\n >\n <div className=\"lb-attachment-preview\">\n {isUploading ? (\n <SpinnerIcon />\n ) : isError ? (\n <WarningIcon />\n ) : (\n <AttachmentPreview\n attachment={attachment}\n allowMediaPreview={allowMediaPreview}\n roomId={roomId}\n />\n )}\n </div>\n <div className=\"lb-attachment-details\">\n <AttachmentName attachment={attachment} />\n <span className=\"lb-attachment-description\" title={description}>\n {description}\n </span>\n </div>\n {onDeleteClick && (\n <Tooltip content={deleteLabel}>\n <button\n type=\"button\"\n className=\"lb-attachment-delete\"\n onClick={onDeleteClick}\n onPointerDown={handleDeletePointerDown}\n aria-label={deleteLabel}\n >\n <CrossIcon />\n </button>\n </Tooltip>\n )}\n </div>\n );\n}\n\nexport function separateMediaAttachments<T extends CommentMixedAttachment>(\n attachments: T[]\n) {\n const mediaAttachments: T[] = [];\n const fileAttachments: T[] = [];\n\n for (const attachment of attachments) {\n if (\n (attachment.mimeType.startsWith(\"image/\") ||\n attachment.mimeType.startsWith(\"video/\")) &&\n attachment.size <= MAX_DISPLAYED_MEDIA_SIZE\n ) {\n mediaAttachments.push(attachment);\n } else {\n fileAttachments.push(attachment);\n }\n }\n\n return {\n mediaAttachments,\n fileAttachments,\n };\n}\n"],"names":["jsx","memo","useMemo","jsxs","useRoomAttachmentUrl","useState","useCallback","Fragment","SpinnerIcon","overrides","useOverrides","useComposerAttachmentsContextOrNull","AttachmentTooLargeError","formatFileSize","classNames","WarningIcon","Tooltip","CrossIcon"],"mappings":"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"}