@liveblocks/react-ui 2.25.0-aiprivatebeta8 → 3.0.0

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 (181) hide show
  1. package/_private/package.json +2 -2
  2. package/dist/_private/index.cjs +14 -12
  3. package/dist/_private/index.cjs.map +1 -1
  4. package/dist/_private/index.d.cts +146 -113
  5. package/dist/_private/index.d.ts +146 -113
  6. package/dist/_private/index.js +10 -5
  7. package/dist/_private/index.js.map +1 -1
  8. package/dist/components/AiChat.cjs +85 -121
  9. package/dist/components/AiChat.cjs.map +1 -1
  10. package/dist/components/AiChat.js +87 -123
  11. package/dist/components/AiChat.js.map +1 -1
  12. package/dist/components/AiTool.cjs +188 -0
  13. package/dist/components/AiTool.cjs.map +1 -0
  14. package/dist/components/AiTool.js +186 -0
  15. package/dist/components/AiTool.js.map +1 -0
  16. package/dist/components/Comment.cjs +259 -238
  17. package/dist/components/Comment.cjs.map +1 -1
  18. package/dist/components/Comment.js +261 -240
  19. package/dist/components/Comment.js.map +1 -1
  20. package/dist/components/Composer.cjs +42 -30
  21. package/dist/components/Composer.cjs.map +1 -1
  22. package/dist/components/Composer.js +44 -32
  23. package/dist/components/Composer.js.map +1 -1
  24. package/dist/components/InboxNotificationList.cjs +11 -3
  25. package/dist/components/InboxNotificationList.cjs.map +1 -1
  26. package/dist/components/InboxNotificationList.js +12 -4
  27. package/dist/components/InboxNotificationList.js.map +1 -1
  28. package/dist/components/Thread.cjs +7 -1
  29. package/dist/components/Thread.cjs.map +1 -1
  30. package/dist/components/Thread.js +8 -2
  31. package/dist/components/Thread.js.map +1 -1
  32. package/dist/components/internal/AiChatAssistantMessage.cjs +75 -199
  33. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  34. package/dist/components/internal/AiChatAssistantMessage.js +77 -201
  35. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  36. package/dist/components/internal/AiChatComposer.cjs +1 -1
  37. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  38. package/dist/components/internal/AiChatComposer.js +1 -1
  39. package/dist/components/internal/AiChatComposer.js.map +1 -1
  40. package/dist/components/internal/AiChatUserMessage.cjs +17 -10
  41. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  42. package/dist/components/internal/AiChatUserMessage.js +17 -10
  43. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  44. package/dist/components/internal/Button.cjs.map +1 -1
  45. package/dist/components/internal/Button.js.map +1 -1
  46. package/dist/components/internal/CodeBlock.cjs +75 -0
  47. package/dist/components/internal/CodeBlock.cjs.map +1 -0
  48. package/dist/components/internal/CodeBlock.js +73 -0
  49. package/dist/components/internal/CodeBlock.js.map +1 -0
  50. package/dist/components/internal/Dropdown.cjs +1 -1
  51. package/dist/components/internal/Dropdown.cjs.map +1 -1
  52. package/dist/components/internal/Dropdown.js +2 -2
  53. package/dist/components/internal/Dropdown.js.map +1 -1
  54. package/dist/components/internal/Emoji.cjs +12 -4
  55. package/dist/components/internal/Emoji.cjs.map +1 -1
  56. package/dist/components/internal/Emoji.js +12 -4
  57. package/dist/components/internal/Emoji.js.map +1 -1
  58. package/dist/components/internal/EmojiPicker.cjs +1 -1
  59. package/dist/components/internal/EmojiPicker.cjs.map +1 -1
  60. package/dist/components/internal/EmojiPicker.js +2 -2
  61. package/dist/components/internal/EmojiPicker.js.map +1 -1
  62. package/dist/components/internal/InboxNotificationThread.cjs +5 -2
  63. package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
  64. package/dist/components/internal/InboxNotificationThread.js +6 -3
  65. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  66. package/dist/components/internal/Prose.cjs +37 -0
  67. package/dist/components/internal/Prose.cjs.map +1 -0
  68. package/dist/components/internal/Prose.js +35 -0
  69. package/dist/components/internal/Prose.js.map +1 -0
  70. package/dist/components/internal/Tooltip.cjs +1 -1
  71. package/dist/components/internal/Tooltip.cjs.map +1 -1
  72. package/dist/components/internal/Tooltip.js +2 -2
  73. package/dist/components/internal/Tooltip.js.map +1 -1
  74. package/dist/config.cjs +9 -9
  75. package/dist/config.cjs.map +1 -1
  76. package/dist/config.js +8 -8
  77. package/dist/config.js.map +1 -1
  78. package/dist/icons/CrossCircleFill.cjs +25 -0
  79. package/dist/icons/CrossCircleFill.cjs.map +1 -0
  80. package/dist/icons/CrossCircleFill.js +23 -0
  81. package/dist/icons/CrossCircleFill.js.map +1 -0
  82. package/dist/icons/MinusCircle.cjs +23 -0
  83. package/dist/icons/MinusCircle.cjs.map +1 -0
  84. package/dist/icons/MinusCircle.js +21 -0
  85. package/dist/icons/MinusCircle.js.map +1 -0
  86. package/dist/icons/index.cjs +4 -0
  87. package/dist/icons/index.cjs.map +1 -1
  88. package/dist/icons/index.js +2 -0
  89. package/dist/icons/index.js.map +1 -1
  90. package/dist/index.cjs +3 -3
  91. package/dist/index.cjs.map +1 -1
  92. package/dist/index.d.cts +270 -22
  93. package/dist/index.d.ts +270 -22
  94. package/dist/index.js +2 -2
  95. package/dist/index.js.map +1 -1
  96. package/dist/overrides.cjs +6 -4
  97. package/dist/overrides.cjs.map +1 -1
  98. package/dist/overrides.js +6 -4
  99. package/dist/overrides.js.map +1 -1
  100. package/dist/primitives/AiMessage/contexts.cjs +18 -0
  101. package/dist/primitives/AiMessage/contexts.cjs.map +1 -0
  102. package/dist/primitives/AiMessage/contexts.js +15 -0
  103. package/dist/primitives/AiMessage/contexts.js.map +1 -0
  104. package/dist/primitives/AiMessage/index.cjs +77 -0
  105. package/dist/primitives/AiMessage/index.cjs.map +1 -0
  106. package/dist/primitives/AiMessage/index.js +75 -0
  107. package/dist/primitives/AiMessage/index.js.map +1 -0
  108. package/dist/primitives/AiMessage/tool-invocation.cjs +70 -0
  109. package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -0
  110. package/dist/primitives/AiMessage/tool-invocation.js +68 -0
  111. package/dist/primitives/AiMessage/tool-invocation.js.map +1 -0
  112. package/dist/primitives/{internal/Collapsible → Collapsible}/index.cjs +39 -17
  113. package/dist/primitives/Collapsible/index.cjs.map +1 -0
  114. package/dist/primitives/{internal/Collapsible → Collapsible}/index.js +37 -15
  115. package/dist/primitives/Collapsible/index.js.map +1 -0
  116. package/dist/primitives/Comment/index.cjs +5 -4
  117. package/dist/primitives/Comment/index.cjs.map +1 -1
  118. package/dist/primitives/Comment/index.js +5 -4
  119. package/dist/primitives/Comment/index.js.map +1 -1
  120. package/dist/primitives/Composer/index.cjs +49 -41
  121. package/dist/primitives/Composer/index.cjs.map +1 -1
  122. package/dist/primitives/Composer/index.js +50 -42
  123. package/dist/primitives/Composer/index.js.map +1 -1
  124. package/dist/primitives/Composer/slate/plugins/mentions.cjs +4 -4
  125. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
  126. package/dist/primitives/Composer/slate/plugins/mentions.js +4 -4
  127. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
  128. package/dist/primitives/Composer/utils.cjs +3 -6
  129. package/dist/primitives/Composer/utils.cjs.map +1 -1
  130. package/dist/primitives/Composer/utils.js +3 -6
  131. package/dist/primitives/Composer/utils.js.map +1 -1
  132. package/dist/primitives/{internal/Markdown.cjs → Markdown.cjs} +105 -65
  133. package/dist/primitives/Markdown.cjs.map +1 -0
  134. package/dist/primitives/{internal/Markdown.js → Markdown.js} +106 -65
  135. package/dist/primitives/Markdown.js.map +1 -0
  136. package/dist/primitives/index.cjs +4 -6
  137. package/dist/primitives/index.cjs.map +1 -1
  138. package/dist/primitives/index.d.cts +20 -93
  139. package/dist/primitives/index.d.ts +20 -93
  140. package/dist/primitives/index.js +4 -6
  141. package/dist/primitives/index.js.map +1 -1
  142. package/dist/utils/ErrorBoundary.cjs +48 -0
  143. package/dist/utils/ErrorBoundary.cjs.map +1 -0
  144. package/dist/utils/ErrorBoundary.js +45 -0
  145. package/dist/utils/ErrorBoundary.js.map +1 -0
  146. package/dist/utils/use-controllable-state.cjs +25 -2
  147. package/dist/utils/use-controllable-state.cjs.map +1 -1
  148. package/dist/utils/use-controllable-state.js +25 -3
  149. package/dist/utils/use-controllable-state.js.map +1 -1
  150. package/dist/utils/use-visible.cjs +65 -45
  151. package/dist/utils/use-visible.cjs.map +1 -1
  152. package/dist/utils/use-visible.js +66 -46
  153. package/dist/utils/use-visible.js.map +1 -1
  154. package/dist/version.cjs +1 -1
  155. package/dist/version.cjs.map +1 -1
  156. package/dist/version.js +1 -1
  157. package/dist/version.js.map +1 -1
  158. package/package.json +16 -5
  159. package/primitives/package.json +2 -2
  160. package/src/styles/constants.css +1 -1
  161. package/src/styles/dark/index.css +7 -3
  162. package/src/styles/index.css +572 -252
  163. package/src/styles/utils.css +1 -1
  164. package/styles/dark/attributes.css +1 -1
  165. package/styles/dark/attributes.css.map +1 -1
  166. package/styles/dark/media-query.css +1 -1
  167. package/styles/dark/media-query.css.map +1 -1
  168. package/styles.css +1 -1
  169. package/styles.css.map +1 -1
  170. package/dist/components/AiToolDebugger.cjs +0 -74
  171. package/dist/components/AiToolDebugger.cjs.map +0 -1
  172. package/dist/components/AiToolDebugger.js +0 -72
  173. package/dist/components/AiToolDebugger.js.map +0 -1
  174. package/dist/primitives/internal/Collapsible/index.cjs.map +0 -1
  175. package/dist/primitives/internal/Collapsible/index.js.map +0 -1
  176. package/dist/primitives/internal/Emoji.cjs +0 -32
  177. package/dist/primitives/internal/Emoji.cjs.map +0 -1
  178. package/dist/primitives/internal/Emoji.js +0 -30
  179. package/dist/primitives/internal/Emoji.js.map +0 -1
  180. package/dist/primitives/internal/Markdown.cjs.map +0 -1
  181. package/dist/primitives/internal/Markdown.js.map +0 -1
@@ -1,8 +1,10 @@
1
1
  "use client";
2
2
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
3
- import { useAddRoomCommentReaction, useRemoveRoomCommentReaction, useRoomAttachmentUrl, useMarkRoomThreadAsRead, useDeleteRoomComment, useEditRoomComment } from '@liveblocks/react/_private';
3
+ import { assertNever, Permission } from '@liveblocks/core';
4
+ import { useAddRoomCommentReaction, useRemoveRoomCommentReaction, useRoomAttachmentUrl, useMarkRoomThreadAsRead, useDeleteRoomComment, useEditRoomComment, useRoomPermissions } from '@liveblocks/react/_private';
4
5
  import * as TogglePrimitive from '@radix-ui/react-toggle';
5
6
  import { forwardRef, useMemo, useCallback, useRef, useState, useEffect } from 'react';
7
+ import { useComponents, ComponentsProvider } from '../components.js';
6
8
  import { MENTION_CHARACTER } from '../constants.js';
7
9
  import { CheckIcon } from '../icons/Check.js';
8
10
  import { CrossIcon } from '../icons/Cross.js';
@@ -18,7 +20,7 @@ import { useCurrentUserId } from '../shared.js';
18
20
  import { classNames } from '../utils/class-names.js';
19
21
  import { download } from '../utils/download.js';
20
22
  import { useRefs } from '../utils/use-refs.js';
21
- import { useVisibleCallback } from '../utils/use-visible.js';
23
+ import { useIntersectionCallback } from '../utils/use-visible.js';
22
24
  import { useWindowFocus } from '../utils/use-window-focus.js';
23
25
  import { Composer } from './Composer.js';
24
26
  import { MediaAttachment, FileAttachment, separateMediaAttachments } from './internal/Attachment.js';
@@ -37,22 +39,27 @@ import { DropdownMenuTrigger } from '@radix-ui/react-dropdown-menu';
37
39
 
38
40
  const REACTIONS_TRUNCATE = 5;
39
41
  function CommentMention({
40
- userId,
42
+ mention,
41
43
  className,
42
44
  ...props
43
45
  }) {
44
46
  const currentId = useCurrentUserId();
45
- return /* @__PURE__ */ jsxs(CommentMention$1, {
46
- className: classNames("lb-comment-mention", className),
47
- "data-self": userId === currentId ? "" : void 0,
48
- ...props,
49
- children: [
50
- MENTION_CHARACTER,
51
- /* @__PURE__ */ jsx(User, {
52
- userId
53
- })
54
- ]
55
- });
47
+ switch (mention.kind) {
48
+ case "user":
49
+ return /* @__PURE__ */ jsxs(CommentMention$1, {
50
+ className: classNames("lb-comment-mention", className),
51
+ "data-self": mention.id === currentId ? "" : void 0,
52
+ ...props,
53
+ children: [
54
+ MENTION_CHARACTER,
55
+ /* @__PURE__ */ jsx(User, {
56
+ userId: mention.id
57
+ })
58
+ ]
59
+ });
60
+ default:
61
+ return assertNever(mention.kind, "Unhandled mention kind");
62
+ }
56
63
  }
57
64
  function CommentLink({
58
65
  href,
@@ -60,11 +67,16 @@ function CommentLink({
60
67
  className,
61
68
  ...props
62
69
  }) {
70
+ const { Anchor } = useComponents();
63
71
  return /* @__PURE__ */ jsx(CommentLink$1, {
64
72
  className: classNames("lb-comment-link", className),
65
73
  href,
66
74
  ...props,
67
- children
75
+ asChild: true,
76
+ children: /* @__PURE__ */ jsx(Anchor, {
77
+ ...props,
78
+ children
79
+ })
68
80
  });
69
81
  }
70
82
  function CommentNonInteractiveLink({
@@ -271,10 +283,12 @@ function AutoMarkReadThreadIdHandler({
271
283
  }) {
272
284
  const markThreadAsRead = useMarkRoomThreadAsRead(roomId);
273
285
  const isWindowFocused = useWindowFocus();
274
- useVisibleCallback(
286
+ useIntersectionCallback(
275
287
  commentRef,
276
- () => {
277
- markThreadAsRead(threadId);
288
+ (isIntersecting) => {
289
+ if (isIntersecting) {
290
+ markThreadAsRead(threadId);
291
+ }
278
292
  },
279
293
  {
280
294
  enabled: isWindowFocused
@@ -297,6 +311,7 @@ const Comment = forwardRef(
297
311
  onCommentEdit,
298
312
  onCommentDelete,
299
313
  overrides,
314
+ components,
300
315
  className,
301
316
  additionalActions,
302
317
  additionalActionsClassName,
@@ -320,6 +335,8 @@ const Comment = forwardRef(
320
335
  const { mediaAttachments, fileAttachments } = useMemo(() => {
321
336
  return separateMediaAttachments(comment.attachments);
322
337
  }, [comment.attachments]);
338
+ const permissions = useRoomPermissions(comment.roomId);
339
+ const canComment = permissions.size > 0 ? permissions.has(Permission.CommentsWrite) || permissions.has(Permission.Write) : true;
323
340
  const stopPropagation = useCallback((event) => {
324
341
  event.stopPropagation();
325
342
  }, []);
@@ -407,254 +424,258 @@ const Comment = forwardRef(
407
424
  if (!showDeleted && !comment.body) {
408
425
  return null;
409
426
  }
410
- return /* @__PURE__ */ jsxs(TooltipProvider, {
411
- children: [
412
- autoMarkReadThreadId && /* @__PURE__ */ jsx(AutoMarkReadThreadIdHandler, {
413
- commentRef: ref,
414
- threadId: autoMarkReadThreadId,
415
- roomId: comment.roomId
416
- }),
417
- /* @__PURE__ */ jsxs("div", {
418
- id: comment.id,
419
- className: classNames(
420
- "lb-root lb-comment",
421
- indentContent && "lb-comment:indent-content",
422
- showActions === "hover" && "lb-comment:show-actions-hover",
423
- (isMoreActionOpen || isReactionActionOpen) && "lb-comment:action-open",
424
- className
425
- ),
426
- "data-deleted": !comment.body ? "" : void 0,
427
- "data-editing": isEditing ? "" : void 0,
428
- "data-target": isTarget ? "" : void 0,
429
- dir: $.dir,
430
- ...props,
431
- ref: mergedRefs,
432
- children: [
433
- /* @__PURE__ */ jsxs("div", {
434
- className: "lb-comment-header",
435
- children: [
436
- /* @__PURE__ */ jsxs("div", {
437
- className: "lb-comment-details",
438
- children: [
439
- /* @__PURE__ */ jsx(Avatar, {
440
- className: "lb-comment-avatar",
441
- userId: comment.userId,
442
- onClick: handleAuthorClick
443
- }),
444
- /* @__PURE__ */ jsxs("span", {
445
- className: "lb-comment-details-labels",
446
- children: [
447
- /* @__PURE__ */ jsx(User, {
448
- className: "lb-comment-author",
449
- userId: comment.userId,
450
- onClick: handleAuthorClick
451
- }),
452
- /* @__PURE__ */ jsxs("span", {
453
- className: "lb-comment-date",
454
- children: [
455
- /* @__PURE__ */ jsx(Timestamp, {
456
- locale: $.locale,
457
- date: comment.createdAt,
458
- className: "lb-date lb-comment-date-created"
459
- }),
460
- comment.editedAt && comment.body && /* @__PURE__ */ jsxs(Fragment, {
461
- children: [
462
- " ",
463
- /* @__PURE__ */ jsx("span", {
464
- className: "lb-comment-date-edited",
465
- children: $.COMMENT_EDITED
466
- })
467
- ]
468
- })
469
- ]
470
- })
471
- ]
472
- })
473
- ]
474
- }),
475
- showActions && !isEditing && /* @__PURE__ */ jsxs("div", {
476
- className: classNames(
477
- "lb-comment-actions",
478
- additionalActionsClassName
479
- ),
480
- children: [
481
- additionalActions ?? null,
482
- showReactions && /* @__PURE__ */ jsx(EmojiPicker, {
483
- onEmojiSelect: handleReactionSelect,
484
- onOpenChange: setReactionActionOpen,
485
- children: /* @__PURE__ */ jsx(Tooltip, {
486
- content: $.COMMENT_ADD_REACTION,
487
- children: /* @__PURE__ */ jsx(PopoverTrigger, {
488
- asChild: true,
489
- children: /* @__PURE__ */ jsx(Button, {
490
- className: "lb-comment-action",
491
- onClick: stopPropagation,
492
- "aria-label": $.COMMENT_ADD_REACTION,
493
- icon: /* @__PURE__ */ jsx(EmojiPlusIcon, {})
494
- })
495
- })
496
- })
497
- }),
498
- comment.userId === currentUserId || additionalDropdownItemsBefore || additionalDropdownItemsAfter ? /* @__PURE__ */ jsx(Dropdown, {
499
- open: isMoreActionOpen,
500
- onOpenChange: setMoreActionOpen,
501
- align: "end",
502
- content: /* @__PURE__ */ jsxs(Fragment, {
427
+ return /* @__PURE__ */ jsx(TooltipProvider, {
428
+ children: /* @__PURE__ */ jsxs(ComponentsProvider, {
429
+ components,
430
+ children: [
431
+ autoMarkReadThreadId && /* @__PURE__ */ jsx(AutoMarkReadThreadIdHandler, {
432
+ commentRef: ref,
433
+ threadId: autoMarkReadThreadId,
434
+ roomId: comment.roomId
435
+ }),
436
+ /* @__PURE__ */ jsxs("div", {
437
+ id: comment.id,
438
+ className: classNames(
439
+ "lb-root lb-comment",
440
+ indentContent && "lb-comment:indent-content",
441
+ showActions === "hover" && "lb-comment:show-actions-hover",
442
+ (isMoreActionOpen || isReactionActionOpen) && "lb-comment:action-open",
443
+ className
444
+ ),
445
+ "data-deleted": !comment.body ? "" : void 0,
446
+ "data-editing": isEditing ? "" : void 0,
447
+ "data-target": isTarget ? "" : void 0,
448
+ dir: $.dir,
449
+ ...props,
450
+ ref: mergedRefs,
451
+ children: [
452
+ /* @__PURE__ */ jsxs("div", {
453
+ className: "lb-comment-header",
454
+ children: [
455
+ /* @__PURE__ */ jsxs("div", {
456
+ className: "lb-comment-details",
457
+ children: [
458
+ /* @__PURE__ */ jsx(Avatar, {
459
+ className: "lb-comment-avatar",
460
+ userId: comment.userId,
461
+ onClick: handleAuthorClick
462
+ }),
463
+ /* @__PURE__ */ jsxs("span", {
464
+ className: "lb-comment-details-labels",
503
465
  children: [
504
- additionalDropdownItemsBefore,
505
- comment.userId === currentUserId && /* @__PURE__ */ jsxs(Fragment, {
466
+ /* @__PURE__ */ jsx(User, {
467
+ className: "lb-comment-author",
468
+ userId: comment.userId,
469
+ onClick: handleAuthorClick
470
+ }),
471
+ /* @__PURE__ */ jsxs("span", {
472
+ className: "lb-comment-date",
506
473
  children: [
507
- /* @__PURE__ */ jsx(DropdownItem, {
508
- onSelect: handleEdit,
509
- onClick: stopPropagation,
510
- icon: /* @__PURE__ */ jsx(EditIcon, {}),
511
- children: $.COMMENT_EDIT
474
+ /* @__PURE__ */ jsx(Timestamp, {
475
+ locale: $.locale,
476
+ date: comment.createdAt,
477
+ className: "lb-date lb-comment-date-created"
512
478
  }),
513
- /* @__PURE__ */ jsx(DropdownItem, {
514
- onSelect: handleDelete,
515
- onClick: stopPropagation,
516
- icon: /* @__PURE__ */ jsx(DeleteIcon, {}),
517
- children: $.COMMENT_DELETE
479
+ comment.editedAt && comment.body && /* @__PURE__ */ jsxs(Fragment, {
480
+ children: [
481
+ " ",
482
+ /* @__PURE__ */ jsx("span", {
483
+ className: "lb-comment-date-edited",
484
+ children: $.COMMENT_EDITED
485
+ })
486
+ ]
518
487
  })
519
488
  ]
520
- }),
521
- additionalDropdownItemsAfter
522
- ]
523
- }),
524
- children: /* @__PURE__ */ jsx(Tooltip, {
525
- content: $.COMMENT_MORE,
526
- children: /* @__PURE__ */ jsx(DropdownMenuTrigger, {
527
- asChild: true,
528
- children: /* @__PURE__ */ jsx(Button, {
529
- className: "lb-comment-action",
530
- disabled: !comment.body,
531
- onClick: stopPropagation,
532
- "aria-label": $.COMMENT_MORE,
533
- icon: /* @__PURE__ */ jsx(EllipsisIcon, {})
534
489
  })
535
- })
536
- })
537
- }) : null
538
- ]
539
- })
540
- ]
541
- }),
542
- /* @__PURE__ */ jsx("div", {
543
- className: "lb-comment-content",
544
- children: isEditing ? /* @__PURE__ */ jsx(Composer, {
545
- className: "lb-comment-composer",
546
- onComposerSubmit: handleEditSubmit,
547
- defaultValue: comment.body,
548
- defaultAttachments: comment.attachments,
549
- autoFocus: true,
550
- showAttribution: false,
551
- showAttachments,
552
- showFormattingControls: showComposerFormattingControls,
553
- actions: /* @__PURE__ */ jsxs(Fragment, {
554
- children: [
555
- /* @__PURE__ */ jsx(Tooltip, {
556
- content: $.COMMENT_EDIT_COMPOSER_CANCEL,
557
- "aria-label": $.COMMENT_EDIT_COMPOSER_CANCEL,
558
- children: /* @__PURE__ */ jsx(Button, {
559
- className: "lb-composer-action",
560
- onClick: handleEditCancel,
561
- icon: /* @__PURE__ */ jsx(CrossIcon, {})
562
- })
563
- }),
564
- /* @__PURE__ */ jsx(ShortcutTooltip, {
565
- content: $.COMMENT_EDIT_COMPOSER_SAVE,
566
- shortcut: "Enter",
567
- children: /* @__PURE__ */ jsx(ComposerSubmit, {
568
- asChild: true,
569
- children: /* @__PURE__ */ jsx(Button, {
570
- variant: "primary",
571
- className: "lb-composer-action",
572
- onClick: stopPropagation,
573
- "aria-label": $.COMMENT_EDIT_COMPOSER_SAVE,
574
- icon: /* @__PURE__ */ jsx(CheckIcon, {})
575
- })
490
+ ]
576
491
  })
577
- })
578
- ]
579
- }),
580
- overrides: {
581
- COMPOSER_PLACEHOLDER: $.COMMENT_EDIT_COMPOSER_PLACEHOLDER
582
- },
583
- roomId: comment.roomId
584
- }) : comment.body ? /* @__PURE__ */ jsxs(Fragment, {
585
- children: [
586
- /* @__PURE__ */ jsx(CommentBody, {
587
- className: "lb-comment-body",
588
- body: comment.body,
589
- components: {
590
- Mention: ({ userId }) => /* @__PURE__ */ jsx(CommentMention, {
591
- userId,
592
- onClick: (event) => onMentionClick?.(userId, event)
593
- }),
594
- Link: CommentLink
595
- }
596
- }),
597
- showAttachments && (mediaAttachments.length > 0 || fileAttachments.length > 0) ? /* @__PURE__ */ jsxs("div", {
598
- className: "lb-comment-attachments",
599
- children: [
600
- mediaAttachments.length > 0 ? /* @__PURE__ */ jsx("div", {
601
- className: "lb-attachments",
602
- children: mediaAttachments.map((attachment) => /* @__PURE__ */ jsx(CommentMediaAttachment, {
603
- attachment,
604
- overrides,
605
- onAttachmentClick,
606
- roomId: comment.roomId
607
- }, attachment.id))
608
- }) : null,
609
- fileAttachments.length > 0 ? /* @__PURE__ */ jsx("div", {
610
- className: "lb-attachments",
611
- children: fileAttachments.map((attachment) => /* @__PURE__ */ jsx(CommentFileAttachment, {
612
- attachment,
613
- overrides,
614
- onAttachmentClick,
615
- roomId: comment.roomId
616
- }, attachment.id))
617
- }) : null
618
492
  ]
619
- }) : null,
620
- showReactions && comment.reactions.length > 0 && /* @__PURE__ */ jsxs("div", {
621
- className: "lb-comment-reactions",
493
+ }),
494
+ showActions && !isEditing && /* @__PURE__ */ jsxs("div", {
495
+ className: classNames(
496
+ "lb-comment-actions",
497
+ additionalActionsClassName
498
+ ),
622
499
  children: [
623
- comment.reactions.map((reaction) => /* @__PURE__ */ jsx(CommentReaction, {
624
- comment,
625
- reaction,
626
- overrides
627
- }, reaction.emoji)),
628
- /* @__PURE__ */ jsx(EmojiPicker, {
500
+ additionalActions ?? null,
501
+ showReactions && canComment ? /* @__PURE__ */ jsx(EmojiPicker, {
629
502
  onEmojiSelect: handleReactionSelect,
503
+ onOpenChange: setReactionActionOpen,
630
504
  children: /* @__PURE__ */ jsx(Tooltip, {
631
505
  content: $.COMMENT_ADD_REACTION,
632
506
  children: /* @__PURE__ */ jsx(PopoverTrigger, {
633
507
  asChild: true,
634
508
  children: /* @__PURE__ */ jsx(Button, {
635
- className: "lb-comment-reaction lb-comment-reaction-add",
636
- variant: "outline",
509
+ className: "lb-comment-action",
637
510
  onClick: stopPropagation,
638
511
  "aria-label": $.COMMENT_ADD_REACTION,
639
512
  icon: /* @__PURE__ */ jsx(EmojiPlusIcon, {})
640
513
  })
641
514
  })
642
515
  })
643
- })
516
+ }) : null,
517
+ comment.userId === currentUserId || additionalDropdownItemsBefore || additionalDropdownItemsAfter ? /* @__PURE__ */ jsx(Dropdown, {
518
+ open: isMoreActionOpen,
519
+ onOpenChange: setMoreActionOpen,
520
+ align: "end",
521
+ content: /* @__PURE__ */ jsxs(Fragment, {
522
+ children: [
523
+ additionalDropdownItemsBefore,
524
+ comment.userId === currentUserId && /* @__PURE__ */ jsxs(Fragment, {
525
+ children: [
526
+ /* @__PURE__ */ jsx(DropdownItem, {
527
+ onSelect: handleEdit,
528
+ onClick: stopPropagation,
529
+ icon: /* @__PURE__ */ jsx(EditIcon, {}),
530
+ children: $.COMMENT_EDIT
531
+ }),
532
+ /* @__PURE__ */ jsx(DropdownItem, {
533
+ onSelect: handleDelete,
534
+ onClick: stopPropagation,
535
+ icon: /* @__PURE__ */ jsx(DeleteIcon, {}),
536
+ children: $.COMMENT_DELETE
537
+ })
538
+ ]
539
+ }),
540
+ additionalDropdownItemsAfter
541
+ ]
542
+ }),
543
+ children: /* @__PURE__ */ jsx(Tooltip, {
544
+ content: $.COMMENT_MORE,
545
+ children: /* @__PURE__ */ jsx(DropdownMenuTrigger, {
546
+ asChild: true,
547
+ children: /* @__PURE__ */ jsx(Button, {
548
+ className: "lb-comment-action",
549
+ disabled: !comment.body,
550
+ onClick: stopPropagation,
551
+ "aria-label": $.COMMENT_MORE,
552
+ icon: /* @__PURE__ */ jsx(EllipsisIcon, {})
553
+ })
554
+ })
555
+ })
556
+ }) : null
644
557
  ]
645
558
  })
646
559
  ]
647
- }) : /* @__PURE__ */ jsx("div", {
648
- className: "lb-comment-body",
649
- children: /* @__PURE__ */ jsx("p", {
650
- className: "lb-comment-deleted",
651
- children: $.COMMENT_DELETED
560
+ }),
561
+ /* @__PURE__ */ jsx("div", {
562
+ className: "lb-comment-content",
563
+ children: isEditing ? /* @__PURE__ */ jsx(Composer, {
564
+ className: "lb-comment-composer",
565
+ onComposerSubmit: handleEditSubmit,
566
+ defaultValue: comment.body,
567
+ defaultAttachments: comment.attachments,
568
+ autoFocus: true,
569
+ showAttribution: false,
570
+ showAttachments,
571
+ showFormattingControls: showComposerFormattingControls,
572
+ actions: /* @__PURE__ */ jsxs(Fragment, {
573
+ children: [
574
+ /* @__PURE__ */ jsx(Tooltip, {
575
+ content: $.COMMENT_EDIT_COMPOSER_CANCEL,
576
+ "aria-label": $.COMMENT_EDIT_COMPOSER_CANCEL,
577
+ children: /* @__PURE__ */ jsx(Button, {
578
+ className: "lb-composer-action",
579
+ onClick: handleEditCancel,
580
+ icon: /* @__PURE__ */ jsx(CrossIcon, {})
581
+ })
582
+ }),
583
+ /* @__PURE__ */ jsx(ShortcutTooltip, {
584
+ content: $.COMMENT_EDIT_COMPOSER_SAVE,
585
+ shortcut: "Enter",
586
+ children: /* @__PURE__ */ jsx(ComposerSubmit, {
587
+ asChild: true,
588
+ children: /* @__PURE__ */ jsx(Button, {
589
+ variant: "primary",
590
+ className: "lb-composer-action",
591
+ onClick: stopPropagation,
592
+ "aria-label": $.COMMENT_EDIT_COMPOSER_SAVE,
593
+ icon: /* @__PURE__ */ jsx(CheckIcon, {})
594
+ })
595
+ })
596
+ })
597
+ ]
598
+ }),
599
+ overrides: {
600
+ COMPOSER_PLACEHOLDER: $.COMMENT_EDIT_COMPOSER_PLACEHOLDER
601
+ },
602
+ roomId: comment.roomId
603
+ }) : comment.body ? /* @__PURE__ */ jsxs(Fragment, {
604
+ children: [
605
+ /* @__PURE__ */ jsx(CommentBody, {
606
+ className: "lb-comment-body",
607
+ body: comment.body,
608
+ components: {
609
+ Mention: ({ mention }) => /* @__PURE__ */ jsx(CommentMention, {
610
+ mention,
611
+ onClick: (event) => onMentionClick?.(mention, event)
612
+ }),
613
+ Link: CommentLink
614
+ }
615
+ }),
616
+ showAttachments && (mediaAttachments.length > 0 || fileAttachments.length > 0) ? /* @__PURE__ */ jsxs("div", {
617
+ className: "lb-comment-attachments",
618
+ children: [
619
+ mediaAttachments.length > 0 ? /* @__PURE__ */ jsx("div", {
620
+ className: "lb-attachments",
621
+ children: mediaAttachments.map((attachment) => /* @__PURE__ */ jsx(CommentMediaAttachment, {
622
+ attachment,
623
+ overrides,
624
+ onAttachmentClick,
625
+ roomId: comment.roomId
626
+ }, attachment.id))
627
+ }) : null,
628
+ fileAttachments.length > 0 ? /* @__PURE__ */ jsx("div", {
629
+ className: "lb-attachments",
630
+ children: fileAttachments.map((attachment) => /* @__PURE__ */ jsx(CommentFileAttachment, {
631
+ attachment,
632
+ overrides,
633
+ onAttachmentClick,
634
+ roomId: comment.roomId
635
+ }, attachment.id))
636
+ }) : null
637
+ ]
638
+ }) : null,
639
+ showReactions && comment.reactions.length > 0 && /* @__PURE__ */ jsxs("div", {
640
+ className: "lb-comment-reactions",
641
+ children: [
642
+ comment.reactions.map((reaction) => /* @__PURE__ */ jsx(CommentReaction, {
643
+ comment,
644
+ reaction,
645
+ overrides,
646
+ disabled: !canComment
647
+ }, reaction.emoji)),
648
+ canComment ? /* @__PURE__ */ jsx(EmojiPicker, {
649
+ onEmojiSelect: handleReactionSelect,
650
+ children: /* @__PURE__ */ jsx(Tooltip, {
651
+ content: $.COMMENT_ADD_REACTION,
652
+ children: /* @__PURE__ */ jsx(PopoverTrigger, {
653
+ asChild: true,
654
+ children: /* @__PURE__ */ jsx(Button, {
655
+ className: "lb-comment-reaction lb-comment-reaction-add",
656
+ variant: "outline",
657
+ onClick: stopPropagation,
658
+ "aria-label": $.COMMENT_ADD_REACTION,
659
+ icon: /* @__PURE__ */ jsx(EmojiPlusIcon, {})
660
+ })
661
+ })
662
+ })
663
+ }) : null
664
+ ]
665
+ })
666
+ ]
667
+ }) : /* @__PURE__ */ jsx("div", {
668
+ className: "lb-comment-body",
669
+ children: /* @__PURE__ */ jsx("p", {
670
+ className: "lb-comment-deleted",
671
+ children: $.COMMENT_DELETED
672
+ })
652
673
  })
653
674
  })
654
- })
655
- ]
656
- })
657
- ]
675
+ ]
676
+ })
677
+ ]
678
+ })
658
679
  });
659
680
  }
660
681
  );