@liveblocks/react-ui 2.25.0-aiprivatebeta9 → 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 (132) hide show
  1. package/_private/package.json +2 -2
  2. package/dist/_private/index.cjs +4 -0
  3. package/dist/_private/index.cjs.map +1 -1
  4. package/dist/_private/index.d.cts +8 -4
  5. package/dist/_private/index.d.ts +8 -4
  6. package/dist/_private/index.js +2 -0
  7. package/dist/_private/index.js.map +1 -1
  8. package/dist/components/AiChat.cjs +15 -19
  9. package/dist/components/AiChat.cjs.map +1 -1
  10. package/dist/components/AiChat.js +16 -20
  11. package/dist/components/AiChat.js.map +1 -1
  12. package/dist/components/AiTool.cjs +52 -28
  13. package/dist/components/AiTool.cjs.map +1 -1
  14. package/dist/components/AiTool.js +53 -29
  15. package/dist/components/AiTool.js.map +1 -1
  16. package/dist/components/Comment.cjs +254 -235
  17. package/dist/components/Comment.cjs.map +1 -1
  18. package/dist/components/Comment.js +255 -236
  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/Thread.cjs +7 -1
  25. package/dist/components/Thread.cjs.map +1 -1
  26. package/dist/components/Thread.js +8 -2
  27. package/dist/components/Thread.js.map +1 -1
  28. package/dist/components/internal/AiChatAssistantMessage.cjs +38 -6
  29. package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
  30. package/dist/components/internal/AiChatAssistantMessage.js +39 -7
  31. package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
  32. package/dist/components/internal/AiChatComposer.cjs.map +1 -1
  33. package/dist/components/internal/AiChatComposer.js.map +1 -1
  34. package/dist/components/internal/AiChatUserMessage.cjs.map +1 -1
  35. package/dist/components/internal/AiChatUserMessage.js.map +1 -1
  36. package/dist/components/internal/CodeBlock.cjs +6 -3
  37. package/dist/components/internal/CodeBlock.cjs.map +1 -1
  38. package/dist/components/internal/CodeBlock.js +6 -3
  39. package/dist/components/internal/CodeBlock.js.map +1 -1
  40. package/dist/components/internal/Dropdown.cjs +1 -1
  41. package/dist/components/internal/Dropdown.cjs.map +1 -1
  42. package/dist/components/internal/Dropdown.js +2 -2
  43. package/dist/components/internal/Dropdown.js.map +1 -1
  44. package/dist/components/internal/EmojiPicker.cjs +1 -1
  45. package/dist/components/internal/EmojiPicker.cjs.map +1 -1
  46. package/dist/components/internal/EmojiPicker.js +2 -2
  47. package/dist/components/internal/EmojiPicker.js.map +1 -1
  48. package/dist/components/internal/InboxNotificationThread.cjs +5 -2
  49. package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
  50. package/dist/components/internal/InboxNotificationThread.js +6 -3
  51. package/dist/components/internal/InboxNotificationThread.js.map +1 -1
  52. package/dist/components/internal/Tooltip.cjs +1 -1
  53. package/dist/components/internal/Tooltip.cjs.map +1 -1
  54. package/dist/components/internal/Tooltip.js +2 -2
  55. package/dist/components/internal/Tooltip.js.map +1 -1
  56. package/dist/config.cjs +9 -9
  57. package/dist/config.cjs.map +1 -1
  58. package/dist/config.js +8 -8
  59. package/dist/config.js.map +1 -1
  60. package/dist/icons/CrossCircleFill.cjs +25 -0
  61. package/dist/icons/CrossCircleFill.cjs.map +1 -0
  62. package/dist/icons/CrossCircleFill.js +23 -0
  63. package/dist/icons/CrossCircleFill.js.map +1 -0
  64. package/dist/icons/MinusCircle.cjs +23 -0
  65. package/dist/icons/MinusCircle.cjs.map +1 -0
  66. package/dist/icons/MinusCircle.js +21 -0
  67. package/dist/icons/MinusCircle.js.map +1 -0
  68. package/dist/icons/index.cjs +4 -0
  69. package/dist/icons/index.cjs.map +1 -1
  70. package/dist/icons/index.js +2 -0
  71. package/dist/icons/index.js.map +1 -1
  72. package/dist/index.cjs +1 -1
  73. package/dist/index.cjs.map +1 -1
  74. package/dist/index.d.cts +232 -25
  75. package/dist/index.d.ts +232 -25
  76. package/dist/index.js +1 -1
  77. package/dist/index.js.map +1 -1
  78. package/dist/overrides.cjs +5 -1
  79. package/dist/overrides.cjs.map +1 -1
  80. package/dist/overrides.js +5 -1
  81. package/dist/overrides.js.map +1 -1
  82. package/dist/primitives/AiMessage/index.cjs +11 -67
  83. package/dist/primitives/AiMessage/index.cjs.map +1 -1
  84. package/dist/primitives/AiMessage/index.js +13 -69
  85. package/dist/primitives/AiMessage/index.js.map +1 -1
  86. package/dist/primitives/AiMessage/tool-invocation.cjs +70 -0
  87. package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -0
  88. package/dist/primitives/AiMessage/tool-invocation.js +68 -0
  89. package/dist/primitives/AiMessage/tool-invocation.js.map +1 -0
  90. package/dist/primitives/Collapsible/index.cjs +3 -3
  91. package/dist/primitives/Collapsible/index.cjs.map +1 -1
  92. package/dist/primitives/Collapsible/index.js +3 -3
  93. package/dist/primitives/Collapsible/index.js.map +1 -1
  94. package/dist/primitives/Comment/index.cjs +5 -4
  95. package/dist/primitives/Comment/index.cjs.map +1 -1
  96. package/dist/primitives/Comment/index.js +5 -4
  97. package/dist/primitives/Comment/index.js.map +1 -1
  98. package/dist/primitives/Composer/index.cjs +49 -41
  99. package/dist/primitives/Composer/index.cjs.map +1 -1
  100. package/dist/primitives/Composer/index.js +50 -42
  101. package/dist/primitives/Composer/index.js.map +1 -1
  102. package/dist/primitives/Composer/slate/plugins/mentions.cjs +4 -4
  103. package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
  104. package/dist/primitives/Composer/slate/plugins/mentions.js +4 -4
  105. package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
  106. package/dist/primitives/Composer/utils.cjs +3 -6
  107. package/dist/primitives/Composer/utils.cjs.map +1 -1
  108. package/dist/primitives/Composer/utils.js +3 -6
  109. package/dist/primitives/Composer/utils.js.map +1 -1
  110. package/dist/primitives/Markdown.cjs +6 -2
  111. package/dist/primitives/Markdown.cjs.map +1 -1
  112. package/dist/primitives/Markdown.js +6 -2
  113. package/dist/primitives/Markdown.js.map +1 -1
  114. package/dist/primitives/index.d.cts +18 -18
  115. package/dist/primitives/index.d.ts +18 -18
  116. package/dist/utils/use-controllable-state.cjs +25 -2
  117. package/dist/utils/use-controllable-state.cjs.map +1 -1
  118. package/dist/utils/use-controllable-state.js +25 -3
  119. package/dist/utils/use-controllable-state.js.map +1 -1
  120. package/dist/utils/use-visible.cjs +3 -1
  121. package/dist/utils/use-visible.cjs.map +1 -1
  122. package/dist/utils/use-visible.js +3 -1
  123. package/dist/utils/use-visible.js.map +1 -1
  124. package/dist/version.cjs +1 -1
  125. package/dist/version.cjs.map +1 -1
  126. package/dist/version.js +1 -1
  127. package/dist/version.js.map +1 -1
  128. package/package.json +16 -5
  129. package/primitives/package.json +2 -2
  130. package/src/styles/index.css +22 -4
  131. package/styles.css +1 -1
  132. package/styles.css.map +1 -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';
@@ -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({
@@ -299,6 +311,7 @@ const Comment = forwardRef(
299
311
  onCommentEdit,
300
312
  onCommentDelete,
301
313
  overrides,
314
+ components,
302
315
  className,
303
316
  additionalActions,
304
317
  additionalActionsClassName,
@@ -322,6 +335,8 @@ const Comment = forwardRef(
322
335
  const { mediaAttachments, fileAttachments } = useMemo(() => {
323
336
  return separateMediaAttachments(comment.attachments);
324
337
  }, [comment.attachments]);
338
+ const permissions = useRoomPermissions(comment.roomId);
339
+ const canComment = permissions.size > 0 ? permissions.has(Permission.CommentsWrite) || permissions.has(Permission.Write) : true;
325
340
  const stopPropagation = useCallback((event) => {
326
341
  event.stopPropagation();
327
342
  }, []);
@@ -409,254 +424,258 @@ const Comment = forwardRef(
409
424
  if (!showDeleted && !comment.body) {
410
425
  return null;
411
426
  }
412
- return /* @__PURE__ */ jsxs(TooltipProvider, {
413
- children: [
414
- autoMarkReadThreadId && /* @__PURE__ */ jsx(AutoMarkReadThreadIdHandler, {
415
- commentRef: ref,
416
- threadId: autoMarkReadThreadId,
417
- roomId: comment.roomId
418
- }),
419
- /* @__PURE__ */ jsxs("div", {
420
- id: comment.id,
421
- className: classNames(
422
- "lb-root lb-comment",
423
- indentContent && "lb-comment:indent-content",
424
- showActions === "hover" && "lb-comment:show-actions-hover",
425
- (isMoreActionOpen || isReactionActionOpen) && "lb-comment:action-open",
426
- className
427
- ),
428
- "data-deleted": !comment.body ? "" : void 0,
429
- "data-editing": isEditing ? "" : void 0,
430
- "data-target": isTarget ? "" : void 0,
431
- dir: $.dir,
432
- ...props,
433
- ref: mergedRefs,
434
- children: [
435
- /* @__PURE__ */ jsxs("div", {
436
- className: "lb-comment-header",
437
- children: [
438
- /* @__PURE__ */ jsxs("div", {
439
- className: "lb-comment-details",
440
- children: [
441
- /* @__PURE__ */ jsx(Avatar, {
442
- className: "lb-comment-avatar",
443
- userId: comment.userId,
444
- onClick: handleAuthorClick
445
- }),
446
- /* @__PURE__ */ jsxs("span", {
447
- className: "lb-comment-details-labels",
448
- children: [
449
- /* @__PURE__ */ jsx(User, {
450
- className: "lb-comment-author",
451
- userId: comment.userId,
452
- onClick: handleAuthorClick
453
- }),
454
- /* @__PURE__ */ jsxs("span", {
455
- className: "lb-comment-date",
456
- children: [
457
- /* @__PURE__ */ jsx(Timestamp, {
458
- locale: $.locale,
459
- date: comment.createdAt,
460
- className: "lb-date lb-comment-date-created"
461
- }),
462
- comment.editedAt && comment.body && /* @__PURE__ */ jsxs(Fragment, {
463
- children: [
464
- " ",
465
- /* @__PURE__ */ jsx("span", {
466
- className: "lb-comment-date-edited",
467
- children: $.COMMENT_EDITED
468
- })
469
- ]
470
- })
471
- ]
472
- })
473
- ]
474
- })
475
- ]
476
- }),
477
- showActions && !isEditing && /* @__PURE__ */ jsxs("div", {
478
- className: classNames(
479
- "lb-comment-actions",
480
- additionalActionsClassName
481
- ),
482
- children: [
483
- additionalActions ?? null,
484
- showReactions && /* @__PURE__ */ jsx(EmojiPicker, {
485
- onEmojiSelect: handleReactionSelect,
486
- onOpenChange: setReactionActionOpen,
487
- children: /* @__PURE__ */ jsx(Tooltip, {
488
- content: $.COMMENT_ADD_REACTION,
489
- children: /* @__PURE__ */ jsx(PopoverTrigger, {
490
- asChild: true,
491
- children: /* @__PURE__ */ jsx(Button, {
492
- className: "lb-comment-action",
493
- onClick: stopPropagation,
494
- "aria-label": $.COMMENT_ADD_REACTION,
495
- icon: /* @__PURE__ */ jsx(EmojiPlusIcon, {})
496
- })
497
- })
498
- })
499
- }),
500
- comment.userId === currentUserId || additionalDropdownItemsBefore || additionalDropdownItemsAfter ? /* @__PURE__ */ jsx(Dropdown, {
501
- open: isMoreActionOpen,
502
- onOpenChange: setMoreActionOpen,
503
- align: "end",
504
- 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",
505
465
  children: [
506
- additionalDropdownItemsBefore,
507
- 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",
508
473
  children: [
509
- /* @__PURE__ */ jsx(DropdownItem, {
510
- onSelect: handleEdit,
511
- onClick: stopPropagation,
512
- icon: /* @__PURE__ */ jsx(EditIcon, {}),
513
- children: $.COMMENT_EDIT
474
+ /* @__PURE__ */ jsx(Timestamp, {
475
+ locale: $.locale,
476
+ date: comment.createdAt,
477
+ className: "lb-date lb-comment-date-created"
514
478
  }),
515
- /* @__PURE__ */ jsx(DropdownItem, {
516
- onSelect: handleDelete,
517
- onClick: stopPropagation,
518
- icon: /* @__PURE__ */ jsx(DeleteIcon, {}),
519
- 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
+ ]
520
487
  })
521
488
  ]
522
- }),
523
- additionalDropdownItemsAfter
524
- ]
525
- }),
526
- children: /* @__PURE__ */ jsx(Tooltip, {
527
- content: $.COMMENT_MORE,
528
- children: /* @__PURE__ */ jsx(DropdownMenuTrigger, {
529
- asChild: true,
530
- children: /* @__PURE__ */ jsx(Button, {
531
- className: "lb-comment-action",
532
- disabled: !comment.body,
533
- onClick: stopPropagation,
534
- "aria-label": $.COMMENT_MORE,
535
- icon: /* @__PURE__ */ jsx(EllipsisIcon, {})
536
489
  })
537
- })
538
- })
539
- }) : null
540
- ]
541
- })
542
- ]
543
- }),
544
- /* @__PURE__ */ jsx("div", {
545
- className: "lb-comment-content",
546
- children: isEditing ? /* @__PURE__ */ jsx(Composer, {
547
- className: "lb-comment-composer",
548
- onComposerSubmit: handleEditSubmit,
549
- defaultValue: comment.body,
550
- defaultAttachments: comment.attachments,
551
- autoFocus: true,
552
- showAttribution: false,
553
- showAttachments,
554
- showFormattingControls: showComposerFormattingControls,
555
- actions: /* @__PURE__ */ jsxs(Fragment, {
556
- children: [
557
- /* @__PURE__ */ jsx(Tooltip, {
558
- content: $.COMMENT_EDIT_COMPOSER_CANCEL,
559
- "aria-label": $.COMMENT_EDIT_COMPOSER_CANCEL,
560
- children: /* @__PURE__ */ jsx(Button, {
561
- className: "lb-composer-action",
562
- onClick: handleEditCancel,
563
- icon: /* @__PURE__ */ jsx(CrossIcon, {})
564
- })
565
- }),
566
- /* @__PURE__ */ jsx(ShortcutTooltip, {
567
- content: $.COMMENT_EDIT_COMPOSER_SAVE,
568
- shortcut: "Enter",
569
- children: /* @__PURE__ */ jsx(ComposerSubmit, {
570
- asChild: true,
571
- children: /* @__PURE__ */ jsx(Button, {
572
- variant: "primary",
573
- className: "lb-composer-action",
574
- onClick: stopPropagation,
575
- "aria-label": $.COMMENT_EDIT_COMPOSER_SAVE,
576
- icon: /* @__PURE__ */ jsx(CheckIcon, {})
577
- })
490
+ ]
578
491
  })
579
- })
580
- ]
581
- }),
582
- overrides: {
583
- COMPOSER_PLACEHOLDER: $.COMMENT_EDIT_COMPOSER_PLACEHOLDER
584
- },
585
- roomId: comment.roomId
586
- }) : comment.body ? /* @__PURE__ */ jsxs(Fragment, {
587
- children: [
588
- /* @__PURE__ */ jsx(CommentBody, {
589
- className: "lb-comment-body",
590
- body: comment.body,
591
- components: {
592
- Mention: ({ userId }) => /* @__PURE__ */ jsx(CommentMention, {
593
- userId,
594
- onClick: (event) => onMentionClick?.(userId, event)
595
- }),
596
- Link: CommentLink
597
- }
598
- }),
599
- showAttachments && (mediaAttachments.length > 0 || fileAttachments.length > 0) ? /* @__PURE__ */ jsxs("div", {
600
- className: "lb-comment-attachments",
601
- children: [
602
- mediaAttachments.length > 0 ? /* @__PURE__ */ jsx("div", {
603
- className: "lb-attachments",
604
- children: mediaAttachments.map((attachment) => /* @__PURE__ */ jsx(CommentMediaAttachment, {
605
- attachment,
606
- overrides,
607
- onAttachmentClick,
608
- roomId: comment.roomId
609
- }, attachment.id))
610
- }) : null,
611
- fileAttachments.length > 0 ? /* @__PURE__ */ jsx("div", {
612
- className: "lb-attachments",
613
- children: fileAttachments.map((attachment) => /* @__PURE__ */ jsx(CommentFileAttachment, {
614
- attachment,
615
- overrides,
616
- onAttachmentClick,
617
- roomId: comment.roomId
618
- }, attachment.id))
619
- }) : null
620
492
  ]
621
- }) : null,
622
- showReactions && comment.reactions.length > 0 && /* @__PURE__ */ jsxs("div", {
623
- className: "lb-comment-reactions",
493
+ }),
494
+ showActions && !isEditing && /* @__PURE__ */ jsxs("div", {
495
+ className: classNames(
496
+ "lb-comment-actions",
497
+ additionalActionsClassName
498
+ ),
624
499
  children: [
625
- comment.reactions.map((reaction) => /* @__PURE__ */ jsx(CommentReaction, {
626
- comment,
627
- reaction,
628
- overrides
629
- }, reaction.emoji)),
630
- /* @__PURE__ */ jsx(EmojiPicker, {
500
+ additionalActions ?? null,
501
+ showReactions && canComment ? /* @__PURE__ */ jsx(EmojiPicker, {
631
502
  onEmojiSelect: handleReactionSelect,
503
+ onOpenChange: setReactionActionOpen,
632
504
  children: /* @__PURE__ */ jsx(Tooltip, {
633
505
  content: $.COMMENT_ADD_REACTION,
634
506
  children: /* @__PURE__ */ jsx(PopoverTrigger, {
635
507
  asChild: true,
636
508
  children: /* @__PURE__ */ jsx(Button, {
637
- className: "lb-comment-reaction lb-comment-reaction-add",
638
- variant: "outline",
509
+ className: "lb-comment-action",
639
510
  onClick: stopPropagation,
640
511
  "aria-label": $.COMMENT_ADD_REACTION,
641
512
  icon: /* @__PURE__ */ jsx(EmojiPlusIcon, {})
642
513
  })
643
514
  })
644
515
  })
645
- })
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
646
557
  ]
647
558
  })
648
559
  ]
649
- }) : /* @__PURE__ */ jsx("div", {
650
- className: "lb-comment-body",
651
- children: /* @__PURE__ */ jsx("p", {
652
- className: "lb-comment-deleted",
653
- 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
+ })
654
673
  })
655
674
  })
656
- })
657
- ]
658
- })
659
- ]
675
+ ]
676
+ })
677
+ ]
678
+ })
660
679
  });
661
680
  }
662
681
  );