@liveblocks/react-ui 2.15.0-debug1 → 2.15.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.
- package/dist/_private/index.js +1 -0
- package/dist/_private/index.js.map +1 -1
- package/dist/_private/index.mjs +1 -0
- package/dist/_private/index.mjs.map +1 -1
- package/dist/components/Comment.js +7 -6
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/Comment.mjs +4 -3
- package/dist/components/Comment.mjs.map +1 -1
- package/dist/components/Composer.js +4 -2
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/Composer.mjs +8 -7
- package/dist/components/Composer.mjs.map +1 -1
- package/dist/components/HistoryVersionSummary.js +3 -10
- package/dist/components/HistoryVersionSummary.js.map +1 -1
- package/dist/components/HistoryVersionSummary.mjs +3 -10
- package/dist/components/HistoryVersionSummary.mjs.map +1 -1
- package/dist/components/HistoryVersionSummaryList.js +1 -0
- package/dist/components/HistoryVersionSummaryList.js.map +1 -1
- package/dist/components/HistoryVersionSummaryList.mjs +1 -0
- package/dist/components/HistoryVersionSummaryList.mjs.map +1 -1
- package/dist/components/InboxNotification.js +1 -0
- package/dist/components/InboxNotification.js.map +1 -1
- package/dist/components/InboxNotification.mjs +1 -0
- package/dist/components/InboxNotification.mjs.map +1 -1
- package/dist/components/InboxNotificationList.js +1 -0
- package/dist/components/InboxNotificationList.js.map +1 -1
- package/dist/components/InboxNotificationList.mjs +3 -2
- package/dist/components/InboxNotificationList.mjs.map +1 -1
- package/dist/components/Thread.js +1 -0
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/Thread.mjs +1 -0
- package/dist/components/Thread.mjs.map +1 -1
- package/dist/components/internal/Attachment.js +3 -6
- package/dist/components/internal/Attachment.js.map +1 -1
- package/dist/components/internal/Attachment.mjs +5 -8
- package/dist/components/internal/Attachment.mjs.map +1 -1
- package/dist/components/internal/Avatar.js +1 -0
- package/dist/components/internal/Avatar.js.map +1 -1
- package/dist/components/internal/Avatar.mjs +1 -0
- package/dist/components/internal/Avatar.mjs.map +1 -1
- package/dist/components/internal/Button.js +1 -0
- package/dist/components/internal/Button.js.map +1 -1
- package/dist/components/internal/Button.mjs +1 -0
- package/dist/components/internal/Button.mjs.map +1 -1
- package/dist/components/internal/Dropdown.js +1 -0
- package/dist/components/internal/Dropdown.js.map +1 -1
- package/dist/components/internal/Dropdown.mjs +2 -1
- package/dist/components/internal/Dropdown.mjs.map +1 -1
- package/dist/components/internal/EmojiPicker.mjs +2 -2
- package/dist/components/internal/Room.js +1 -0
- package/dist/components/internal/Room.js.map +1 -1
- package/dist/components/internal/Room.mjs +1 -0
- package/dist/components/internal/Room.mjs.map +1 -1
- package/dist/components/internal/Tooltip.js +1 -0
- package/dist/components/internal/Tooltip.js.map +1 -1
- package/dist/components/internal/Tooltip.mjs +1 -0
- package/dist/components/internal/Tooltip.mjs.map +1 -1
- package/dist/components/internal/User.js +1 -0
- package/dist/components/internal/User.js.map +1 -1
- package/dist/components/internal/User.mjs +1 -0
- package/dist/components/internal/User.mjs.map +1 -1
- package/dist/components.js +1 -0
- package/dist/components.js.map +1 -1
- package/dist/components.mjs +1 -0
- package/dist/components.mjs.map +1 -1
- package/dist/config.js +1 -0
- package/dist/config.js.map +1 -1
- package/dist/config.mjs +1 -0
- package/dist/config.mjs.map +1 -1
- package/dist/icons/index.js +42 -0
- package/dist/icons/index.js.map +1 -0
- package/dist/icons/index.mjs +19 -0
- package/dist/icons/index.mjs.map +1 -0
- package/dist/overrides.js +1 -0
- package/dist/overrides.js.map +1 -1
- package/dist/overrides.mjs +1 -0
- package/dist/overrides.mjs.map +1 -1
- package/dist/primitives/Composer/index.js +14 -13
- package/dist/primitives/Composer/index.js.map +1 -1
- package/dist/primitives/Composer/index.mjs +10 -9
- package/dist/primitives/Composer/index.mjs.map +1 -1
- package/dist/primitives/Composer/utils.js +2 -1
- package/dist/primitives/Composer/utils.js.map +1 -1
- package/dist/primitives/Composer/utils.mjs +4 -3
- package/dist/primitives/Composer/utils.mjs.map +1 -1
- package/dist/primitives/EmojiPicker/index.js +1 -0
- package/dist/primitives/EmojiPicker/index.js.map +1 -1
- package/dist/primitives/EmojiPicker/index.mjs +3 -2
- package/dist/primitives/EmojiPicker/index.mjs.map +1 -1
- package/dist/primitives/FileSize.js +1 -0
- package/dist/primitives/FileSize.js.map +1 -1
- package/dist/primitives/FileSize.mjs +1 -0
- package/dist/primitives/FileSize.mjs.map +1 -1
- package/dist/primitives/Timestamp.js +1 -0
- package/dist/primitives/Timestamp.js.map +1 -1
- package/dist/primitives/Timestamp.mjs +1 -0
- package/dist/primitives/Timestamp.mjs.map +1 -1
- package/dist/slate/plugins/auto-links.mjs +1 -1
- package/dist/slate/plugins/custom-links.mjs +1 -1
- package/dist/slate/plugins/mentions.mjs +1 -1
- package/dist/utils/Persist.js +1 -0
- package/dist/utils/Persist.js.map +1 -1
- package/dist/utils/Persist.mjs +2 -1
- package/dist/utils/Persist.mjs.map +1 -1
- package/dist/utils/Portal.js +1 -0
- package/dist/utils/Portal.js.map +1 -1
- package/dist/utils/Portal.mjs +1 -0
- package/dist/utils/Portal.mjs.map +1 -1
- package/dist/utils/use-visible.js +22 -0
- package/dist/utils/use-visible.js.map +1 -1
- package/dist/utils/use-visible.mjs +23 -2
- package/dist/utils/use-visible.mjs.map +1 -1
- package/dist/version.js +2 -2
- package/dist/version.js.map +1 -1
- package/dist/version.mjs +2 -2
- package/dist/version.mjs.map +1 -1
- package/package.json +8 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../src/primitives/Composer/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type CommentAttachment,\n type CommentBody,\n type CommentLocalAttachment,\n createCommentAttachmentId,\n type EventSource,\n makeEventSource,\n} from \"@liveblocks/core\";\nimport {\n useClientOrNull,\n useMentionSuggestions,\n useResolveMentionSuggestions,\n useRoomOrNull,\n useSyncSource,\n} from \"@liveblocks/react/_private\";\nimport { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport type {\n AriaAttributes,\n ChangeEvent,\n FocusEvent,\n FormEvent,\n KeyboardEvent,\n MouseEvent,\n PointerEvent,\n SyntheticEvent,\n} from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n Descendant as SlateDescendant,\n Element as SlateElement,\n} from \"slate\";\nimport {\n createEditor,\n Editor as SlateEditor,\n insertText as insertSlateText,\n Range as SlateRange,\n Transforms as SlateTransforms,\n} from \"slate\";\nimport { withHistory } from \"slate-history\";\nimport type {\n RenderElementProps,\n RenderElementSpecificProps,\n RenderLeafProps,\n RenderPlaceholderProps,\n} from \"slate-react\";\nimport {\n Editable,\n ReactEditor,\n Slate,\n useSelected,\n useSlateStatic,\n withReact,\n} from \"slate-react\";\n\nimport { useLiveblocksUIConfig } from \"../../config\";\nimport { withAutoFormatting } from \"../../slate/plugins/auto-formatting\";\nimport { withAutoLinks } from \"../../slate/plugins/auto-links\";\nimport { withCustomLinks } from \"../../slate/plugins/custom-links\";\nimport { withEmptyClearFormatting } from \"../../slate/plugins/empty-clear-formatting\";\nimport type { MentionDraft } from \"../../slate/plugins/mentions\";\nimport {\n getMentionDraftAtSelection,\n insertMention,\n insertMentionCharacter,\n MENTION_CHARACTER,\n withMentions,\n} from \"../../slate/plugins/mentions\";\nimport { withNormalize } from \"../../slate/plugins/normalize\";\nimport { withPaste } from \"../../slate/plugins/paste\";\nimport { getDOMRange } from \"../../slate/utils/get-dom-range\";\nimport { isEmpty as isEditorEmpty } from \"../../slate/utils/is-empty\";\nimport {\n getMarks,\n leaveMarkEdge,\n toggleMark as toggleEditorMark,\n} from \"../../slate/utils/marks\";\nimport type {\n ComposerBody as ComposerBodyData,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMark,\n ComposerBodyMarks,\n ComposerBodyMention,\n} from \"../../types\";\nimport { isKey } from \"../../utils/is-key\";\nimport { Persist, useAnimationPersist, usePersist } from \"../../utils/Persist\";\nimport { Portal } from \"../../utils/Portal\";\nimport { requestSubmit } from \"../../utils/request-submit\";\nimport { useIndex } from \"../../utils/use-index\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useObservable } from \"../../utils/use-observable\";\nimport { useRefs } from \"../../utils/use-refs\";\nimport { toAbsoluteUrl } from \"../Comment/utils\";\nimport {\n ComposerAttachmentsContext,\n ComposerContext,\n ComposerEditorContext,\n ComposerFloatingToolbarContext,\n ComposerSuggestionsContext,\n useComposer,\n useComposerAttachmentsContext,\n useComposerEditorContext,\n useComposerFloatingToolbarContext,\n useComposerSuggestionsContext,\n} from \"./contexts\";\nimport type {\n ComposerAttachFilesProps,\n ComposerAttachmentsDropAreaProps,\n ComposerEditorComponents,\n ComposerEditorElementProps,\n ComposerEditorFloatingToolbarWrapperProps,\n ComposerEditorLinkWrapperProps,\n ComposerEditorMentionSuggestionsWrapperProps,\n ComposerEditorMentionWrapperProps,\n ComposerEditorProps,\n ComposerFloatingToolbarProps,\n ComposerFormProps,\n ComposerLinkProps,\n ComposerMarkToggleProps,\n ComposerMentionProps,\n ComposerSubmitProps,\n ComposerSuggestionsListItemProps,\n ComposerSuggestionsListProps,\n ComposerSuggestionsProps,\n FloatingPosition,\n} from \"./types\";\nimport {\n commentBodyToComposerBody,\n composerBodyToCommentBody,\n getSideAndAlignFromFloatingPlacement,\n useComposerAttachmentsDropArea,\n useComposerAttachmentsManager,\n useContentZIndex,\n useFloatingWithOptions,\n} from \"./utils\";\n\nconst MENTION_SUGGESTIONS_POSITION: FloatingPosition = \"top\";\n\nconst FLOATING_TOOLBAR_POSITION: FloatingPosition = \"top\";\n\nconst COMPOSER_MENTION_NAME = \"ComposerMention\";\nconst COMPOSER_LINK_NAME = \"ComposerLink\";\nconst COMPOSER_FLOATING_TOOLBAR_NAME = \"ComposerFloatingToolbar\";\nconst COMPOSER_SUGGESTIONS_NAME = \"ComposerSuggestions\";\nconst COMPOSER_SUGGESTIONS_LIST_NAME = \"ComposerSuggestionsList\";\nconst COMPOSER_SUGGESTIONS_LIST_ITEM_NAME = \"ComposerSuggestionsListItem\";\nconst COMPOSER_SUBMIT_NAME = \"ComposerSubmit\";\nconst COMPOSER_EDITOR_NAME = \"ComposerEditor\";\nconst COMPOSER_ATTACH_FILES_NAME = \"ComposerAttachFiles\";\nconst COMPOSER_ATTACHMENTS_DROP_AREA_NAME = \"ComposerAttachmentsDropArea\";\nconst COMPOSER_MARK_TOGGLE_NAME = \"ComposerMarkToggle\";\nconst COMPOSER_FORM_NAME = \"ComposerForm\";\n\nconst emptyCommentBody: CommentBody = {\n version: 1,\n content: [{ type: \"paragraph\", children: [{ text: \"\" }] }],\n};\n\nfunction createComposerEditor({\n createAttachments,\n pasteFilesAsAttachments,\n}: {\n createAttachments: (files: File[]) => void;\n pasteFilesAsAttachments?: boolean;\n}) {\n return withNormalize(\n withMentions(\n withCustomLinks(\n withAutoLinks(\n withAutoFormatting(\n withEmptyClearFormatting(\n withPaste(withHistory(withReact(createEditor())), {\n createAttachments,\n pasteFilesAsAttachments,\n })\n )\n )\n )\n )\n )\n );\n}\n\nfunction ComposerEditorMentionWrapper({\n Mention,\n attributes,\n children,\n element,\n}: ComposerEditorMentionWrapperProps) {\n const isSelected = useSelected();\n\n return (\n <span {...attributes}>\n {element.id ? (\n <Mention userId={element.id} isSelected={isSelected} />\n ) : null}\n {children}\n </span>\n );\n}\n\nfunction ComposerEditorLinkWrapper({\n Link,\n attributes,\n element,\n children,\n}: ComposerEditorLinkWrapperProps) {\n const href = useMemo(\n () => toAbsoluteUrl(element.url) ?? element.url,\n [element.url]\n );\n\n return (\n <span {...attributes}>\n <Link href={href}>{children}</Link>\n </span>\n );\n}\n\nfunction ComposerEditorMentionSuggestionsWrapper({\n id,\n itemId,\n userIds,\n selectedUserId,\n setSelectedUserId,\n mentionDraft,\n setMentionDraft,\n onItemSelect,\n position = MENTION_SUGGESTIONS_POSITION,\n dir,\n MentionSuggestions,\n}: ComposerEditorMentionSuggestionsWrapperProps) {\n const editor = useSlateStatic();\n const { onEditorChange } = useComposerEditorContext();\n const { isFocused } = useComposer();\n const { portalContainer } = useLiveblocksUIConfig();\n const [contentRef, contentZIndex] = useContentZIndex();\n const isOpen =\n isFocused && mentionDraft?.range !== undefined && userIds !== undefined;\n const {\n refs: { setReference, setFloating },\n strategy,\n isPositioned,\n placement,\n x,\n y,\n } = useFloatingWithOptions({\n position,\n dir,\n alignment: \"start\",\n open: isOpen,\n });\n\n useObservable(onEditorChange, () => {\n setMentionDraft(getMentionDraftAtSelection(editor));\n });\n\n useLayoutEffect(() => {\n if (!mentionDraft) {\n setReference(null);\n\n return;\n }\n\n const domRange = getDOMRange(editor, mentionDraft.range);\n setReference(domRange ?? null);\n }, [setReference, editor, mentionDraft]);\n\n return (\n <Persist>\n {isOpen ? (\n <ComposerSuggestionsContext.Provider\n value={{\n id,\n itemId,\n selectedValue: selectedUserId,\n setSelectedValue: setSelectedUserId,\n onItemSelect,\n placement,\n dir,\n ref: contentRef,\n }}\n >\n <Portal\n ref={setFloating}\n container={portalContainer}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n minWidth: \"max-content\",\n zIndex: contentZIndex,\n }}\n >\n <MentionSuggestions\n userIds={userIds}\n selectedUserId={selectedUserId}\n />\n </Portal>\n </ComposerSuggestionsContext.Provider>\n ) : null}\n </Persist>\n );\n}\n\nfunction ComposerEditorFloatingToolbarWrapper({\n id,\n position = FLOATING_TOOLBAR_POSITION,\n dir,\n FloatingToolbar,\n hasFloatingToolbarRange,\n setHasFloatingToolbarRange,\n}: ComposerEditorFloatingToolbarWrapperProps) {\n const editor = useSlateStatic();\n const { onEditorChange } = useComposerEditorContext();\n const { isFocused } = useComposer();\n const { portalContainer } = useLiveblocksUIConfig();\n const [contentRef, contentZIndex] = useContentZIndex();\n const [isPointerDown, setPointerDown] = useState(false);\n const isOpen = isFocused && !isPointerDown && hasFloatingToolbarRange;\n const {\n refs: { setReference, setFloating },\n strategy,\n isPositioned,\n placement,\n x,\n y,\n } = useFloatingWithOptions({\n type: \"range\",\n position,\n dir,\n alignment: \"center\",\n open: isOpen,\n });\n\n useLayoutEffect(() => {\n if (!isFocused) {\n return;\n }\n\n const handlePointerDown = () => setPointerDown(true);\n const handlePointerUp = () => setPointerDown(false);\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [isFocused]);\n\n useObservable(onEditorChange, () => {\n // Detach from previous selection range (if any) to avoid sudden jumps\n setReference(null);\n\n // Then, wait for the next render to ensure the selection is updated\n requestAnimationFrame(() => {\n const domSelection = window.getSelection();\n\n // Finally, show the toolbar if there's a selection range\n if (\n !editor.selection ||\n SlateRange.isCollapsed(editor.selection) ||\n !domSelection ||\n !domSelection.rangeCount\n ) {\n setHasFloatingToolbarRange(false);\n setReference(null);\n } else {\n setHasFloatingToolbarRange(true);\n\n const domRange = domSelection.getRangeAt(0);\n setReference(domRange);\n }\n });\n });\n\n return (\n <Persist>\n {isOpen ? (\n <ComposerFloatingToolbarContext.Provider\n value={{\n id,\n placement,\n dir,\n ref: contentRef,\n }}\n >\n <Portal\n ref={setFloating}\n container={portalContainer}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n minWidth: \"max-content\",\n zIndex: contentZIndex,\n }}\n >\n <FloatingToolbar />\n </Portal>\n </ComposerFloatingToolbarContext.Provider>\n ) : null}\n </Persist>\n );\n}\n\n/**\n * Displays a floating toolbar attached to the selection within `Composer.Editor`.\n *\n * @example\n * <Composer.FloatingToolbar>\n * <Composer.MarkToggle mark=\"bold\">Bold</Composer.MarkToggle>\n * <Composer.MarkToggle mark=\"italic\">Italic</Composer.MarkToggle>\n * </Composer.FloatingToolbar>\n */\nconst ComposerFloatingToolbar = forwardRef<\n HTMLDivElement,\n ComposerFloatingToolbarProps\n>(({ children, onPointerDown, style, asChild, ...props }, forwardedRef) => {\n const [isPresent] = usePersist();\n const ref = useRef<HTMLDivElement>(null);\n const {\n id,\n ref: contentRef,\n placement,\n dir,\n } = useComposerFloatingToolbarContext(COMPOSER_FLOATING_TOOLBAR_NAME);\n const mergedRefs = useRefs(forwardedRef, contentRef, ref);\n const [side, align] = useMemo(\n () => getSideAndAlignFromFloatingPlacement(placement),\n [placement]\n );\n const Component = asChild ? Slot : \"div\";\n useAnimationPersist(ref);\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onPointerDown]\n );\n\n return (\n <Component\n dir={dir}\n role=\"toolbar\"\n id={id}\n aria-label=\"Floating toolbar\"\n {...props}\n onPointerDown={handlePointerDown}\n data-state={isPresent ? \"open\" : \"closed\"}\n data-side={side}\n data-align={align}\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n maxWidth: \"var(--lb-composer-floating-available-width)\",\n overflowX: \"auto\",\n ...style,\n }}\n ref={mergedRefs}\n >\n {children}\n </Component>\n );\n});\n\nfunction ComposerEditorElement({\n Mention,\n Link,\n ...props\n}: ComposerEditorElementProps) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { attributes, children, element } = props;\n\n switch (element.type) {\n case \"mention\":\n return (\n <ComposerEditorMentionWrapper\n Mention={Mention}\n {...(props as RenderElementSpecificProps<ComposerBodyMention>)}\n />\n );\n case \"auto-link\":\n case \"custom-link\":\n return (\n <ComposerEditorLinkWrapper\n Link={Link}\n {...(props as RenderElementSpecificProps<\n ComposerBodyAutoLink | ComposerBodyCustomLink\n >)}\n />\n );\n case \"paragraph\":\n return (\n <p {...attributes} style={{ position: \"relative\" }}>\n {children}\n </p>\n );\n default:\n return null;\n }\n}\n\n// <code><s><em><strong>text</strong></s></em></code>\nfunction ComposerEditorLeaf({ attributes, children, leaf }: RenderLeafProps) {\n if (leaf.bold) {\n children = <strong>{children}</strong>;\n }\n\n if (leaf.italic) {\n children = <em>{children}</em>;\n }\n\n if (leaf.strikethrough) {\n children = <s>{children}</s>;\n }\n\n if (leaf.code) {\n children = <code>{children}</code>;\n }\n\n return <span {...attributes}>{children}</span>;\n}\n\nfunction ComposerEditorPlaceholder({\n attributes,\n children,\n}: RenderPlaceholderProps) {\n const { opacity: _opacity, ...style } = attributes.style;\n\n return (\n <span {...attributes} style={style} data-placeholder=\"\">\n {children}\n </span>\n );\n}\n\n/**\n * Displays mentions within `Composer.Editor`.\n *\n * @example\n * <Composer.Mention>@{userId}</Composer.Mention>\n */\nconst ComposerMention = forwardRef<HTMLSpanElement, ComposerMentionProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"span\";\n const isSelected = useSelected();\n\n return (\n <Component\n data-selected={isSelected || undefined}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n }\n);\n\n/**\n * Displays links within `Composer.Editor`.\n *\n * @example\n * <Composer.Link href={href}>{children}</Composer.Link>\n */\nconst ComposerLink = forwardRef<HTMLAnchorElement, ComposerLinkProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"a\";\n\n return (\n <Component\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n }\n);\n\n/**\n * Contains suggestions within `Composer.Editor`.\n */\nconst ComposerSuggestions = forwardRef<\n HTMLDivElement,\n ComposerSuggestionsProps\n>(({ children, style, asChild, ...props }, forwardedRef) => {\n const [isPresent] = usePersist();\n const ref = useRef<HTMLDivElement>(null);\n const {\n ref: contentRef,\n placement,\n dir,\n } = useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_NAME);\n const mergedRefs = useRefs(forwardedRef, contentRef, ref);\n const [side, align] = useMemo(\n () => getSideAndAlignFromFloatingPlacement(placement),\n [placement]\n );\n const Component = asChild ? Slot : \"div\";\n useAnimationPersist(ref);\n\n return (\n <Component\n dir={dir}\n {...props}\n data-state={isPresent ? \"open\" : \"closed\"}\n data-side={side}\n data-align={align}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"var(--lb-composer-floating-available-height)\",\n overflowY: \"auto\",\n ...style,\n }}\n ref={mergedRefs}\n >\n {children}\n </Component>\n );\n});\n\n/**\n * Displays a list of suggestions within `Composer.Editor`.\n *\n * @example\n * <Composer.SuggestionsList>\n * {userIds.map((userId) => (\n * <Composer.SuggestionsListItem key={userId} value={userId}>\n * @{userId}\n * </Composer.SuggestionsListItem>\n * ))}\n * </Composer.SuggestionsList>\n */\nconst ComposerSuggestionsList = forwardRef<\n HTMLUListElement,\n ComposerSuggestionsListProps\n>(({ children, asChild, ...props }, forwardedRef) => {\n const { id } = useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_NAME);\n const Component = asChild ? Slot : \"ul\";\n\n return (\n <Component\n role=\"listbox\"\n id={id}\n aria-label=\"Suggestions list\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n});\n\n/**\n * Displays a suggestion within `Composer.SuggestionsList`.\n *\n * @example\n * <Composer.SuggestionsListItem key={userId} value={userId}>\n * @{userId}\n * </Composer.SuggestionsListItem>\n */\nconst ComposerSuggestionsListItem = forwardRef<\n HTMLLIElement,\n ComposerSuggestionsListItemProps\n>(\n (\n {\n value,\n children,\n onPointerMove,\n onPointerDown,\n onClick,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const ref = useRef<HTMLLIElement>(null);\n const mergedRefs = useRefs(forwardedRef, ref);\n const { selectedValue, setSelectedValue, itemId, onItemSelect } =\n useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_ITEM_NAME);\n const Component = asChild ? Slot : \"li\";\n const isSelected = useMemo(\n () => selectedValue === value,\n [selectedValue, value]\n );\n // TODO: Support props.id if provided, it will need to be sent up to Composer.Editor to use it in aria-activedescendant\n const id = useMemo(() => itemId(value), [itemId, value]);\n\n useEffect(() => {\n if (ref?.current && isSelected) {\n ref.current.scrollIntoView({ block: \"nearest\" });\n }\n }, [isSelected]);\n\n const handlePointerMove = useCallback(\n (event: PointerEvent<HTMLLIElement>) => {\n onPointerMove?.(event);\n\n if (!event.isDefaultPrevented()) {\n setSelectedValue(value);\n }\n },\n [onPointerMove, setSelectedValue, value]\n );\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLLIElement>) => {\n onPointerDown?.(event);\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onPointerDown]\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLLIElement>) => {\n onClick?.(event);\n\n const wasDefaultPrevented = event.isDefaultPrevented();\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!wasDefaultPrevented) {\n onItemSelect(value);\n }\n },\n [onClick, onItemSelect, value]\n );\n\n return (\n <Component\n role=\"option\"\n id={id}\n data-selected={isSelected || undefined}\n aria-selected={isSelected || undefined}\n onPointerMove={handlePointerMove}\n onPointerDown={handlePointerDown}\n onClick={handleClick}\n {...props}\n ref={mergedRefs}\n >\n {children}\n </Component>\n );\n }\n);\n\nconst defaultEditorComponents: ComposerEditorComponents = {\n Link: ({ href, children }) => {\n return <ComposerLink href={href}>{children}</ComposerLink>;\n },\n Mention: ({ userId }) => {\n return (\n <ComposerMention>\n {MENTION_CHARACTER}\n {userId}\n </ComposerMention>\n );\n },\n MentionSuggestions: ({ userIds }) => {\n return userIds.length > 0 ? (\n <ComposerSuggestions>\n <ComposerSuggestionsList>\n {userIds.map((userId) => (\n <ComposerSuggestionsListItem key={userId} value={userId}>\n {userId}\n </ComposerSuggestionsListItem>\n ))}\n </ComposerSuggestionsList>\n </ComposerSuggestions>\n ) : null;\n },\n};\n\n/**\n * Displays the composer's editor.\n *\n * @example\n * <Composer.Editor placeholder=\"Write a comment…\" />\n */\nconst ComposerEditor = forwardRef<HTMLDivElement, ComposerEditorProps>(\n (\n {\n defaultValue,\n onKeyDown,\n onFocus,\n onBlur,\n disabled,\n autoFocus,\n components,\n dir,\n ...props\n },\n forwardedRef\n ) => {\n const client = useClientOrNull();\n const { editor, validate, setFocused, onEditorChange, roomId } =\n useComposerEditorContext();\n const {\n submit,\n focus,\n blur,\n select,\n canSubmit,\n isDisabled: isComposerDisabled,\n isFocused,\n } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const initialBody = useInitial(defaultValue ?? emptyCommentBody);\n const initialEditorValue = useMemo(() => {\n return commentBodyToComposerBody(initialBody);\n }, [initialBody]);\n const { Link, Mention, MentionSuggestions, FloatingToolbar } = useMemo(\n () => ({ ...defaultEditorComponents, ...components }),\n [components]\n );\n\n const [hasFloatingToolbarRange, setHasFloatingToolbarRange] =\n useState(false);\n // If used with LiveblocksProvider but without resolveMentionSuggestions,\n // we can skip the mention suggestions logic entirely\n const resolveMentionSuggestions = useResolveMentionSuggestions();\n const hasResolveMentionSuggestions = client\n ? resolveMentionSuggestions\n : true;\n const [mentionDraft, setMentionDraft] = useState<MentionDraft>();\n const mentionSuggestions = useMentionSuggestions(\n roomId,\n mentionDraft?.text\n );\n const [\n selectedMentionSuggestionIndex,\n setPreviousSelectedMentionSuggestionIndex,\n setNextSelectedMentionSuggestionIndex,\n setSelectedMentionSuggestionIndex,\n ] = useIndex(0, mentionSuggestions?.length ?? 0);\n const id = useId();\n const floatingToolbarId = useMemo(\n () => `liveblocks-floating-toolbar-${id}`,\n [id]\n );\n const suggestionsListId = useMemo(\n () => `liveblocks-suggestions-list-${id}`,\n [id]\n );\n const suggestionsListItemId = useCallback(\n (userId?: string) =>\n userId ? `liveblocks-suggestions-list-item-${id}-${userId}` : undefined,\n [id]\n );\n\n const renderElement = useCallback(\n (props: RenderElementProps) => {\n return (\n <ComposerEditorElement Mention={Mention} Link={Link} {...props} />\n );\n },\n [Link, Mention]\n );\n\n const handleChange = useCallback(\n (value: SlateDescendant[]) => {\n validate(value as SlateElement[]);\n\n // Our multi-component setup requires us to instantiate the editor in `Composer.Form`\n // but we can only listen to changes here in `Composer.Editor` via `Slate`, so we use\n // an event source to notify `Composer.Form` of changes.\n onEditorChange.notify();\n },\n [validate, onEditorChange]\n );\n\n const createMention = useCallback(\n (userId?: string) => {\n if (!mentionDraft || !userId) {\n return;\n }\n\n SlateTransforms.select(editor, mentionDraft.range);\n insertMention(editor, userId);\n setMentionDraft(undefined);\n setSelectedMentionSuggestionIndex(0);\n },\n [editor, mentionDraft, setSelectedMentionSuggestionIndex]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n // Allow leaving marks with ArrowLeft\n if (isKey(event, \"ArrowLeft\")) {\n leaveMarkEdge(editor, \"start\");\n }\n\n // Allow leaving marks with ArrowRight\n if (isKey(event, \"ArrowRight\")) {\n leaveMarkEdge(editor, \"end\");\n }\n\n if (mentionDraft && mentionSuggestions?.length) {\n // Select the next mention suggestion on ArrowDown\n if (isKey(event, \"ArrowDown\")) {\n event.preventDefault();\n setNextSelectedMentionSuggestionIndex();\n }\n\n // Select the previous mention suggestion on ArrowUp\n if (isKey(event, \"ArrowUp\")) {\n event.preventDefault();\n setPreviousSelectedMentionSuggestionIndex();\n }\n\n // Create a mention on Enter/Tab\n if (isKey(event, \"Enter\") || isKey(event, \"Tab\")) {\n event.preventDefault();\n\n const userId = mentionSuggestions?.[selectedMentionSuggestionIndex];\n createMention(userId);\n }\n\n // Close the suggestions on Escape\n if (isKey(event, \"Escape\")) {\n event.preventDefault();\n setMentionDraft(undefined);\n setSelectedMentionSuggestionIndex(0);\n }\n } else {\n if (hasFloatingToolbarRange) {\n // Close the floating toolbar on Escape\n if (isKey(event, \"Escape\")) {\n event.preventDefault();\n setHasFloatingToolbarRange(false);\n }\n }\n\n // Blur the editor on Escape\n if (isKey(event, \"Escape\")) {\n event.preventDefault();\n blur();\n }\n\n // Submit the editor on Enter\n if (isKey(event, \"Enter\", { shift: false })) {\n // Even if submitting is not possible, don't do anything else on Enter. (e.g. creating a new line)\n event.preventDefault();\n\n if (canSubmit) {\n submit();\n }\n }\n\n // Create a new line on Shift + Enter\n if (isKey(event, \"Enter\", { shift: true })) {\n event.preventDefault();\n editor.insertBreak();\n }\n\n // Toggle bold on Command/Control + B\n if (isKey(event, \"b\", { mod: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"bold\");\n }\n\n // Toggle italic on Command/Control + I\n if (isKey(event, \"i\", { mod: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"italic\");\n }\n\n // Toggle strikethrough on Command/Control + Shift + S\n if (isKey(event, \"s\", { mod: true, shift: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"strikethrough\");\n }\n\n // Toggle code on Command/Control + E\n if (isKey(event, \"e\", { mod: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"code\");\n }\n }\n },\n [\n onKeyDown,\n mentionDraft,\n mentionSuggestions,\n hasFloatingToolbarRange,\n editor,\n setNextSelectedMentionSuggestionIndex,\n setPreviousSelectedMentionSuggestionIndex,\n selectedMentionSuggestionIndex,\n createMention,\n setSelectedMentionSuggestionIndex,\n blur,\n canSubmit,\n submit,\n ]\n );\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(true);\n }\n },\n [onFocus, setFocused]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(false);\n }\n },\n [onBlur, setFocused]\n );\n\n const selectedMentionSuggestionUserId = useMemo(\n () => mentionSuggestions?.[selectedMentionSuggestionIndex],\n [selectedMentionSuggestionIndex, mentionSuggestions]\n );\n const setSelectedMentionSuggestionUserId = useCallback(\n (userId: string) => {\n const index = mentionSuggestions?.indexOf(userId);\n\n if (index !== undefined && index >= 0) {\n setSelectedMentionSuggestionIndex(index);\n }\n },\n [setSelectedMentionSuggestionIndex, mentionSuggestions]\n );\n\n const additionalProps: AriaAttributes = useMemo(\n () =>\n mentionDraft\n ? {\n role: \"combobox\",\n \"aria-autocomplete\": \"list\",\n \"aria-expanded\": true,\n \"aria-controls\": suggestionsListId,\n \"aria-activedescendant\": suggestionsListItemId(\n selectedMentionSuggestionUserId\n ),\n }\n : hasFloatingToolbarRange\n ? {\n \"aria-haspopup\": true,\n \"aria-controls\": floatingToolbarId,\n }\n : {},\n [\n mentionDraft,\n suggestionsListId,\n suggestionsListItemId,\n selectedMentionSuggestionUserId,\n hasFloatingToolbarRange,\n floatingToolbarId,\n ]\n );\n\n useImperativeHandle(forwardedRef, () => {\n return ReactEditor.toDOMNode(editor, editor) as HTMLDivElement;\n }, [editor]);\n\n // Manually focus the editor when `autoFocus` is true\n useLayoutEffect(() => {\n if (autoFocus) {\n focus();\n }\n }, [autoFocus, editor, focus]);\n\n // Manually add a selection in the editor if the selection\n // is still empty after being focused\n useLayoutEffect(() => {\n if (isFocused && editor.selection === null) {\n select();\n }\n }, [editor, select, isFocused]);\n\n return (\n <Slate\n editor={editor}\n initialValue={initialEditorValue}\n onChange={handleChange}\n >\n <Editable\n dir={dir}\n enterKeyHint={mentionDraft ? \"enter\" : \"send\"}\n autoCapitalize=\"sentences\"\n aria-label=\"Composer editor\"\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n {...additionalProps}\n {...props}\n readOnly={isDisabled}\n disabled={isDisabled}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n renderElement={renderElement}\n renderLeaf={ComposerEditorLeaf}\n renderPlaceholder={ComposerEditorPlaceholder}\n />\n {hasResolveMentionSuggestions && (\n <ComposerEditorMentionSuggestionsWrapper\n dir={dir}\n mentionDraft={mentionDraft}\n setMentionDraft={setMentionDraft}\n selectedUserId={selectedMentionSuggestionUserId}\n setSelectedUserId={setSelectedMentionSuggestionUserId}\n userIds={mentionSuggestions}\n id={suggestionsListId}\n itemId={suggestionsListItemId}\n onItemSelect={createMention}\n MentionSuggestions={MentionSuggestions}\n />\n )}\n {FloatingToolbar && (\n <ComposerEditorFloatingToolbarWrapper\n dir={dir}\n id={floatingToolbarId}\n hasFloatingToolbarRange={hasFloatingToolbarRange}\n setHasFloatingToolbarRange={setHasFloatingToolbarRange}\n FloatingToolbar={FloatingToolbar}\n />\n )}\n </Slate>\n );\n }\n);\n\nconst MAX_ATTACHMENTS = 10;\nconst MAX_ATTACHMENT_SIZE = 1024 * 1024 * 1024; // 1 GB\n\nfunction prepareAttachment(file: File): CommentLocalAttachment {\n return {\n type: \"localAttachment\",\n status: \"idle\",\n id: createCommentAttachmentId(),\n name: file.name,\n size: file.size,\n mimeType: file.type,\n file,\n };\n}\n\n/**\n * Surrounds the composer's content and handles submissions.\n *\n * @example\n * <Composer.Form onComposerSubmit={({ body }) => {}}>\n *\t <Composer.Editor />\n * <Composer.Submit />\n * </Composer.Form>\n */\nconst ComposerForm = forwardRef<HTMLFormElement, ComposerFormProps>(\n (\n {\n children,\n onSubmit,\n onComposerSubmit,\n defaultAttachments = [],\n pasteFilesAsAttachments,\n preventUnsavedChanges = true,\n disabled,\n asChild,\n roomId: _roomId,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"form\";\n const [isEmpty, setEmpty] = useState(true);\n const [isSubmitting, setSubmitting] = useState(false);\n const [isFocused, setFocused] = useState(false);\n const room = useRoomOrNull();\n\n const roomId = _roomId !== undefined ? _roomId : room?.id;\n if (roomId === undefined) {\n throw new Error(\"Composer.Form must be a descendant of RoomProvider.\");\n }\n\n // Later: Offer as Composer.Form props: { maxAttachments: number; maxAttachmentSize: number; supportedAttachmentMimeTypes: string[]; }\n const maxAttachments = MAX_ATTACHMENTS;\n const maxAttachmentSize = MAX_ATTACHMENT_SIZE;\n\n const {\n attachments,\n isUploadingAttachments,\n addAttachments,\n removeAttachment,\n clearAttachments,\n } = useComposerAttachmentsManager(defaultAttachments, {\n maxFileSize: maxAttachmentSize,\n roomId,\n });\n const numberOfAttachments = attachments.length;\n const hasMaxAttachments = numberOfAttachments >= maxAttachments;\n\n const isDisabled = useMemo(() => {\n return isSubmitting || disabled === true;\n }, [isSubmitting, disabled]);\n const canSubmit = useMemo(() => {\n return !isEmpty && !isUploadingAttachments;\n }, [isEmpty, isUploadingAttachments]);\n const [marks, setMarks] = useState<ComposerBodyMarks>(getMarks);\n\n const ref = useRef<HTMLFormElement>(null);\n const mergedRefs = useRefs(forwardedRef, ref);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const syncSource = useSyncSource();\n\n // Mark the composer as a pending update when it has unsubmitted (draft)\n // text or attachments\n const isPending = !preventUnsavedChanges\n ? false\n : !isEmpty || isUploadingAttachments || attachments.length > 0;\n\n useEffect(() => {\n syncSource?.setSyncStatus(\n isPending ? \"has-local-changes\" : \"synchronized\"\n );\n }, [syncSource, isPending]);\n\n const createAttachments = useCallback(\n (files: File[]) => {\n if (!files.length) {\n return;\n }\n\n const numberOfAcceptedFiles = Math.max(\n 0,\n maxAttachments - numberOfAttachments\n );\n\n files.splice(numberOfAcceptedFiles);\n\n const attachments = files.map((file) => prepareAttachment(file));\n\n addAttachments(attachments);\n },\n [addAttachments, maxAttachments, numberOfAttachments]\n );\n\n const createAttachmentsRef = useRef(createAttachments);\n\n useEffect(() => {\n createAttachmentsRef.current = createAttachments;\n }, [createAttachments]);\n\n const stableCreateAttachments = useCallback((files: File[]) => {\n createAttachmentsRef.current(files);\n }, []);\n\n const editor = useInitial(() =>\n createComposerEditor({\n createAttachments: stableCreateAttachments,\n pasteFilesAsAttachments,\n })\n );\n const onEditorChange = useInitial(makeEventSource) as EventSource<void>;\n\n const validate = useCallback(\n (value: SlateElement[]) => {\n setEmpty(isEditorEmpty(editor, value));\n },\n [editor]\n );\n\n const submit = useCallback(() => {\n if (!canSubmit) {\n return;\n }\n\n // We need to wait for the next frame in some cases like when composing diacritics,\n // we want any native handling to be done first while still being handled on `keydown`.\n requestAnimationFrame(() => {\n if (ref.current) {\n requestSubmit(ref.current);\n }\n });\n }, [canSubmit]);\n\n const clear = useCallback(() => {\n SlateTransforms.delete(editor, {\n at: {\n anchor: SlateEditor.start(editor, []),\n focus: SlateEditor.end(editor, []),\n },\n });\n }, [editor]);\n\n const select = useCallback(() => {\n SlateTransforms.select(editor, SlateEditor.end(editor, []));\n }, [editor]);\n\n const focus = useCallback(\n (resetSelection = true) => {\n if (!ReactEditor.isFocused(editor)) {\n SlateTransforms.select(\n editor,\n resetSelection || !editor.selection\n ? SlateEditor.end(editor, [])\n : editor.selection\n );\n ReactEditor.focus(editor);\n }\n },\n [editor]\n );\n\n const blur = useCallback(() => {\n ReactEditor.blur(editor);\n }, [editor]);\n\n const createMention = useCallback(() => {\n if (disabled) {\n return;\n }\n\n focus();\n insertMentionCharacter(editor);\n }, [disabled, editor, focus]);\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n\n focus(false);\n insertSlateText(editor, text);\n },\n [disabled, editor, focus]\n );\n\n const attachFiles = useCallback(() => {\n if (disabled) {\n return;\n }\n\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\n }, [disabled]);\n\n const handleAttachmentsInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (disabled) {\n return;\n }\n\n if (event.target.files) {\n createAttachments(Array.from(event.target.files));\n\n // Reset the input value to allow selecting the same file(s) again\n event.target.value = \"\";\n }\n },\n [createAttachments, disabled]\n );\n\n const onSubmitEnd = useCallback(() => {\n clear();\n blur();\n clearAttachments();\n setSubmitting(false);\n }, [blur, clear, clearAttachments]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n if (disabled) {\n return;\n }\n\n // In some situations (e.g. pressing Enter while composing diacritics), it's possible\n // for the form to be submitted as empty even though we already checked whether the\n // editor was empty when handling the key press.\n const isEmpty = isEditorEmpty(editor, editor.children);\n\n // We even prevent the user's `onSubmit` handler from being called if the editor is empty.\n if (isEmpty) {\n event.preventDefault();\n\n return;\n }\n\n onSubmit?.(event);\n\n if (!onComposerSubmit || event.isDefaultPrevented()) {\n event.preventDefault();\n\n return;\n }\n\n const body = composerBodyToCommentBody(\n editor.children as ComposerBodyData\n );\n // Only non-local attachments are included to be submitted.\n const commentAttachments: CommentAttachment[] = attachments\n .filter(\n (attachment) =>\n attachment.type === \"attachment\" ||\n (attachment.type === \"localAttachment\" &&\n attachment.status === \"uploaded\")\n )\n .map((attachment) => {\n return {\n id: attachment.id,\n type: \"attachment\",\n mimeType: attachment.mimeType,\n size: attachment.size,\n name: attachment.name,\n };\n });\n\n const promise = onComposerSubmit(\n { body, attachments: commentAttachments },\n event\n );\n\n event.preventDefault();\n\n if (promise) {\n setSubmitting(true);\n promise.then(onSubmitEnd);\n } else {\n onSubmitEnd();\n }\n },\n [disabled, editor, attachments, onComposerSubmit, onSubmit, onSubmitEnd]\n );\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n const toggleMark = useCallback(\n (mark: ComposerBodyMark) => {\n toggleEditorMark(editor, mark);\n },\n [editor]\n );\n\n useObservable(onEditorChange, () => {\n setMarks(getMarks(editor));\n });\n\n return (\n <ComposerEditorContext.Provider\n value={{\n editor,\n validate,\n setFocused,\n onEditorChange,\n roomId,\n }}\n >\n <ComposerAttachmentsContext.Provider\n value={{\n createAttachments,\n isUploadingAttachments,\n hasMaxAttachments,\n maxAttachments,\n maxAttachmentSize,\n }}\n >\n <ComposerContext.Provider\n value={{\n isDisabled,\n isFocused,\n isEmpty,\n canSubmit,\n submit,\n clear,\n select,\n focus,\n blur,\n createMention,\n insertText,\n attachments,\n attachFiles,\n removeAttachment,\n toggleMark,\n marks,\n }}\n >\n <Component {...props} onSubmit={handleSubmit} ref={mergedRefs}>\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n onChange={handleAttachmentsInputChange}\n onClick={stopPropagation}\n tabIndex={-1}\n style={{ display: \"none\" }}\n />\n <Slottable>{children}</Slottable>\n </Component>\n </ComposerContext.Provider>\n </ComposerAttachmentsContext.Provider>\n </ComposerEditorContext.Provider>\n );\n }\n);\n\n/**\n * A button to submit the composer.\n *\n * @example\n * <Composer.Submit>Send</Composer.Submit>\n */\nconst ComposerSubmit = forwardRef<HTMLButtonElement, ComposerSubmitProps>(\n ({ children, disabled, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { canSubmit, isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled || !canSubmit;\n\n return (\n <Component\n type=\"submit\"\n {...props}\n ref={forwardedRef}\n disabled={isDisabled}\n >\n {children}\n </Component>\n );\n }\n);\n\n/**\n * A button which opens a file picker to create attachments.\n *\n * @example\n * <Composer.AttachFiles>Attach files</Composer.AttachFiles>\n */\nconst ComposerAttachFiles = forwardRef<\n HTMLButtonElement,\n ComposerAttachFilesProps\n>(({ children, onClick, disabled, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { hasMaxAttachments } = useComposerAttachmentsContext();\n const { isDisabled: isComposerDisabled, attachFiles } = useComposer();\n const isDisabled = isComposerDisabled || hasMaxAttachments || disabled;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (!event.isDefaultPrevented()) {\n attachFiles();\n }\n },\n [attachFiles, onClick]\n );\n\n return (\n <Component\n type=\"button\"\n {...props}\n onClick={handleClick}\n ref={forwardedRef}\n disabled={isDisabled}\n >\n {children}\n </Component>\n );\n});\n\n/**\n * A drop area which accepts files to create attachments.\n *\n * @example\n * <Composer.AttachmentsDropArea>\n * Drop files here\n * </Composer.AttachmentsDropArea>\n */\nconst ComposerAttachmentsDropArea = forwardRef<\n HTMLDivElement,\n ComposerAttachmentsDropAreaProps\n>(\n (\n {\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"div\";\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const [, dropAreaProps] = useComposerAttachmentsDropArea({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled: isDisabled,\n });\n\n return (\n <Component\n {...dropAreaProps}\n data-disabled={isDisabled ? \"\" : undefined}\n {...props}\n ref={forwardedRef}\n />\n );\n }\n);\n\n/**\n * A toggle button which toggles a specific text mark.\n *\n * @example\n * <Composer.MarkToggle mark=\"bold\">\n * Bold\n * </Composer.MarkToggle>\n */\nconst ComposerMarkToggle = forwardRef<\n HTMLButtonElement,\n ComposerMarkToggleProps\n>(\n (\n { children, mark, onValueChange, onClick, asChild, ...props },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"button\";\n const { marks, toggleMark } = useComposer();\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (!event.isDefaultPrevented()) {\n toggleMark(mark);\n onValueChange?.(mark);\n }\n },\n [mark, onClick, onValueChange, toggleMark]\n );\n\n return (\n <TogglePrimitive.Root\n asChild\n pressed={marks[mark]}\n onClick={handleClick}\n {...props}\n >\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n </TogglePrimitive.Root>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n ComposerAttachFiles.displayName = COMPOSER_ATTACH_FILES_NAME;\n ComposerAttachmentsDropArea.displayName = COMPOSER_ATTACHMENTS_DROP_AREA_NAME;\n ComposerEditor.displayName = COMPOSER_EDITOR_NAME;\n ComposerFloatingToolbar.displayName = COMPOSER_FLOATING_TOOLBAR_NAME;\n ComposerForm.displayName = COMPOSER_FORM_NAME;\n ComposerMention.displayName = COMPOSER_MENTION_NAME;\n ComposerLink.displayName = COMPOSER_LINK_NAME;\n ComposerSubmit.displayName = COMPOSER_SUBMIT_NAME;\n ComposerSuggestions.displayName = COMPOSER_SUGGESTIONS_NAME;\n ComposerSuggestionsList.displayName = COMPOSER_SUGGESTIONS_LIST_NAME;\n ComposerSuggestionsListItem.displayName = COMPOSER_SUGGESTIONS_LIST_ITEM_NAME;\n ComposerMarkToggle.displayName = COMPOSER_MARK_TOGGLE_NAME;\n}\n\n// NOTE: Every export from this file will be available publicly as Composer.*\nexport {\n ComposerAttachFiles as AttachFiles,\n ComposerAttachmentsDropArea as AttachmentsDropArea,\n ComposerEditor as Editor,\n ComposerFloatingToolbar as FloatingToolbar,\n ComposerForm as Form,\n ComposerLink as Link,\n ComposerMarkToggle as MarkToggle,\n ComposerMention as Mention,\n ComposerSubmit as Submit,\n ComposerSuggestions as Suggestions,\n ComposerSuggestionsList as SuggestionsList,\n ComposerSuggestionsListItem as SuggestionsListItem,\n};\n"],"names":["SlateRange","props","SlateTransforms","toggleEditorMark","isEmpty","attachments","isEditorEmpty","SlateEditor","insertText","insertSlateText","toggleMark"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../src/primitives/Composer/index.tsx"],"sourcesContent":["\"use client\";\n\nimport {\n type CommentAttachment,\n type CommentBody,\n type CommentLocalAttachment,\n createCommentAttachmentId,\n type EventSource,\n makeEventSource,\n} from \"@liveblocks/core\";\nimport {\n useClientOrNull,\n useMentionSuggestions,\n useResolveMentionSuggestions,\n useRoomOrNull,\n useSyncSource,\n} from \"@liveblocks/react/_private\";\nimport { Slot, Slottable } from \"@radix-ui/react-slot\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport type {\n AriaAttributes,\n ChangeEvent,\n FocusEvent,\n FormEvent,\n KeyboardEvent,\n MouseEvent,\n PointerEvent,\n SyntheticEvent,\n} from \"react\";\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useId,\n useImperativeHandle,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport type {\n Descendant as SlateDescendant,\n Element as SlateElement,\n} from \"slate\";\nimport {\n createEditor,\n Editor as SlateEditor,\n insertText as insertSlateText,\n Range as SlateRange,\n Transforms as SlateTransforms,\n} from \"slate\";\nimport { withHistory } from \"slate-history\";\nimport type {\n RenderElementProps,\n RenderElementSpecificProps,\n RenderLeafProps,\n RenderPlaceholderProps,\n} from \"slate-react\";\nimport {\n Editable,\n ReactEditor,\n Slate,\n useSelected,\n useSlateStatic,\n withReact,\n} from \"slate-react\";\n\nimport { useLiveblocksUIConfig } from \"../../config\";\nimport { withAutoFormatting } from \"../../slate/plugins/auto-formatting\";\nimport { withAutoLinks } from \"../../slate/plugins/auto-links\";\nimport { withCustomLinks } from \"../../slate/plugins/custom-links\";\nimport { withEmptyClearFormatting } from \"../../slate/plugins/empty-clear-formatting\";\nimport type { MentionDraft } from \"../../slate/plugins/mentions\";\nimport {\n getMentionDraftAtSelection,\n insertMention,\n insertMentionCharacter,\n MENTION_CHARACTER,\n withMentions,\n} from \"../../slate/plugins/mentions\";\nimport { withNormalize } from \"../../slate/plugins/normalize\";\nimport { withPaste } from \"../../slate/plugins/paste\";\nimport { getDOMRange } from \"../../slate/utils/get-dom-range\";\nimport { isEmpty as isEditorEmpty } from \"../../slate/utils/is-empty\";\nimport {\n getMarks,\n leaveMarkEdge,\n toggleMark as toggleEditorMark,\n} from \"../../slate/utils/marks\";\nimport type {\n ComposerBody as ComposerBodyData,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMark,\n ComposerBodyMarks,\n ComposerBodyMention,\n} from \"../../types\";\nimport { isKey } from \"../../utils/is-key\";\nimport { Persist, useAnimationPersist, usePersist } from \"../../utils/Persist\";\nimport { Portal } from \"../../utils/Portal\";\nimport { requestSubmit } from \"../../utils/request-submit\";\nimport { useIndex } from \"../../utils/use-index\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useObservable } from \"../../utils/use-observable\";\nimport { useRefs } from \"../../utils/use-refs\";\nimport { toAbsoluteUrl } from \"../Comment/utils\";\nimport {\n ComposerAttachmentsContext,\n ComposerContext,\n ComposerEditorContext,\n ComposerFloatingToolbarContext,\n ComposerSuggestionsContext,\n useComposer,\n useComposerAttachmentsContext,\n useComposerEditorContext,\n useComposerFloatingToolbarContext,\n useComposerSuggestionsContext,\n} from \"./contexts\";\nimport type {\n ComposerAttachFilesProps,\n ComposerAttachmentsDropAreaProps,\n ComposerEditorComponents,\n ComposerEditorElementProps,\n ComposerEditorFloatingToolbarWrapperProps,\n ComposerEditorLinkWrapperProps,\n ComposerEditorMentionSuggestionsWrapperProps,\n ComposerEditorMentionWrapperProps,\n ComposerEditorProps,\n ComposerFloatingToolbarProps,\n ComposerFormProps,\n ComposerLinkProps,\n ComposerMarkToggleProps,\n ComposerMentionProps,\n ComposerSubmitProps,\n ComposerSuggestionsListItemProps,\n ComposerSuggestionsListProps,\n ComposerSuggestionsProps,\n FloatingPosition,\n} from \"./types\";\nimport {\n commentBodyToComposerBody,\n composerBodyToCommentBody,\n getSideAndAlignFromFloatingPlacement,\n useComposerAttachmentsDropArea,\n useComposerAttachmentsManager,\n useContentZIndex,\n useFloatingWithOptions,\n} from \"./utils\";\n\nconst MENTION_SUGGESTIONS_POSITION: FloatingPosition = \"top\";\n\nconst FLOATING_TOOLBAR_POSITION: FloatingPosition = \"top\";\n\nconst COMPOSER_MENTION_NAME = \"ComposerMention\";\nconst COMPOSER_LINK_NAME = \"ComposerLink\";\nconst COMPOSER_FLOATING_TOOLBAR_NAME = \"ComposerFloatingToolbar\";\nconst COMPOSER_SUGGESTIONS_NAME = \"ComposerSuggestions\";\nconst COMPOSER_SUGGESTIONS_LIST_NAME = \"ComposerSuggestionsList\";\nconst COMPOSER_SUGGESTIONS_LIST_ITEM_NAME = \"ComposerSuggestionsListItem\";\nconst COMPOSER_SUBMIT_NAME = \"ComposerSubmit\";\nconst COMPOSER_EDITOR_NAME = \"ComposerEditor\";\nconst COMPOSER_ATTACH_FILES_NAME = \"ComposerAttachFiles\";\nconst COMPOSER_ATTACHMENTS_DROP_AREA_NAME = \"ComposerAttachmentsDropArea\";\nconst COMPOSER_MARK_TOGGLE_NAME = \"ComposerMarkToggle\";\nconst COMPOSER_FORM_NAME = \"ComposerForm\";\n\nconst emptyCommentBody: CommentBody = {\n version: 1,\n content: [{ type: \"paragraph\", children: [{ text: \"\" }] }],\n};\n\nfunction createComposerEditor({\n createAttachments,\n pasteFilesAsAttachments,\n}: {\n createAttachments: (files: File[]) => void;\n pasteFilesAsAttachments?: boolean;\n}) {\n return withNormalize(\n withMentions(\n withCustomLinks(\n withAutoLinks(\n withAutoFormatting(\n withEmptyClearFormatting(\n withPaste(withHistory(withReact(createEditor())), {\n createAttachments,\n pasteFilesAsAttachments,\n })\n )\n )\n )\n )\n )\n );\n}\n\nfunction ComposerEditorMentionWrapper({\n Mention,\n attributes,\n children,\n element,\n}: ComposerEditorMentionWrapperProps) {\n const isSelected = useSelected();\n\n return (\n <span {...attributes}>\n {element.id ? (\n <Mention userId={element.id} isSelected={isSelected} />\n ) : null}\n {children}\n </span>\n );\n}\n\nfunction ComposerEditorLinkWrapper({\n Link,\n attributes,\n element,\n children,\n}: ComposerEditorLinkWrapperProps) {\n const href = useMemo(\n () => toAbsoluteUrl(element.url) ?? element.url,\n [element.url]\n );\n\n return (\n <span {...attributes}>\n <Link href={href}>{children}</Link>\n </span>\n );\n}\n\nfunction ComposerEditorMentionSuggestionsWrapper({\n id,\n itemId,\n userIds,\n selectedUserId,\n setSelectedUserId,\n mentionDraft,\n setMentionDraft,\n onItemSelect,\n position = MENTION_SUGGESTIONS_POSITION,\n dir,\n MentionSuggestions,\n}: ComposerEditorMentionSuggestionsWrapperProps) {\n const editor = useSlateStatic();\n const { onEditorChange } = useComposerEditorContext();\n const { isFocused } = useComposer();\n const { portalContainer } = useLiveblocksUIConfig();\n const [contentRef, contentZIndex] = useContentZIndex();\n const isOpen =\n isFocused && mentionDraft?.range !== undefined && userIds !== undefined;\n const {\n refs: { setReference, setFloating },\n strategy,\n isPositioned,\n placement,\n x,\n y,\n } = useFloatingWithOptions({\n position,\n dir,\n alignment: \"start\",\n open: isOpen,\n });\n\n useObservable(onEditorChange, () => {\n setMentionDraft(getMentionDraftAtSelection(editor));\n });\n\n useLayoutEffect(() => {\n if (!mentionDraft) {\n setReference(null);\n\n return;\n }\n\n const domRange = getDOMRange(editor, mentionDraft.range);\n setReference(domRange ?? null);\n }, [setReference, editor, mentionDraft]);\n\n return (\n <Persist>\n {isOpen ? (\n <ComposerSuggestionsContext.Provider\n value={{\n id,\n itemId,\n selectedValue: selectedUserId,\n setSelectedValue: setSelectedUserId,\n onItemSelect,\n placement,\n dir,\n ref: contentRef,\n }}\n >\n <Portal\n ref={setFloating}\n container={portalContainer}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n minWidth: \"max-content\",\n zIndex: contentZIndex,\n }}\n >\n <MentionSuggestions\n userIds={userIds}\n selectedUserId={selectedUserId}\n />\n </Portal>\n </ComposerSuggestionsContext.Provider>\n ) : null}\n </Persist>\n );\n}\n\nfunction ComposerEditorFloatingToolbarWrapper({\n id,\n position = FLOATING_TOOLBAR_POSITION,\n dir,\n FloatingToolbar,\n hasFloatingToolbarRange,\n setHasFloatingToolbarRange,\n}: ComposerEditorFloatingToolbarWrapperProps) {\n const editor = useSlateStatic();\n const { onEditorChange } = useComposerEditorContext();\n const { isFocused } = useComposer();\n const { portalContainer } = useLiveblocksUIConfig();\n const [contentRef, contentZIndex] = useContentZIndex();\n const [isPointerDown, setPointerDown] = useState(false);\n const isOpen = isFocused && !isPointerDown && hasFloatingToolbarRange;\n const {\n refs: { setReference, setFloating },\n strategy,\n isPositioned,\n placement,\n x,\n y,\n } = useFloatingWithOptions({\n type: \"range\",\n position,\n dir,\n alignment: \"center\",\n open: isOpen,\n });\n\n useLayoutEffect(() => {\n if (!isFocused) {\n return;\n }\n\n const handlePointerDown = () => setPointerDown(true);\n const handlePointerUp = () => setPointerDown(false);\n\n document.addEventListener(\"pointerdown\", handlePointerDown);\n document.addEventListener(\"pointerup\", handlePointerUp);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handlePointerDown);\n document.removeEventListener(\"pointerup\", handlePointerUp);\n };\n }, [isFocused]);\n\n useObservable(onEditorChange, () => {\n // Detach from previous selection range (if any) to avoid sudden jumps\n setReference(null);\n\n // Then, wait for the next render to ensure the selection is updated\n requestAnimationFrame(() => {\n const domSelection = window.getSelection();\n\n // Finally, show the toolbar if there's a selection range\n if (\n !editor.selection ||\n SlateRange.isCollapsed(editor.selection) ||\n !domSelection ||\n !domSelection.rangeCount\n ) {\n setHasFloatingToolbarRange(false);\n setReference(null);\n } else {\n setHasFloatingToolbarRange(true);\n\n const domRange = domSelection.getRangeAt(0);\n setReference(domRange);\n }\n });\n });\n\n return (\n <Persist>\n {isOpen ? (\n <ComposerFloatingToolbarContext.Provider\n value={{\n id,\n placement,\n dir,\n ref: contentRef,\n }}\n >\n <Portal\n ref={setFloating}\n container={portalContainer}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n minWidth: \"max-content\",\n zIndex: contentZIndex,\n }}\n >\n <FloatingToolbar />\n </Portal>\n </ComposerFloatingToolbarContext.Provider>\n ) : null}\n </Persist>\n );\n}\n\n/**\n * Displays a floating toolbar attached to the selection within `Composer.Editor`.\n *\n * @example\n * <Composer.FloatingToolbar>\n * <Composer.MarkToggle mark=\"bold\">Bold</Composer.MarkToggle>\n * <Composer.MarkToggle mark=\"italic\">Italic</Composer.MarkToggle>\n * </Composer.FloatingToolbar>\n */\nconst ComposerFloatingToolbar = forwardRef<\n HTMLDivElement,\n ComposerFloatingToolbarProps\n>(({ children, onPointerDown, style, asChild, ...props }, forwardedRef) => {\n const [isPresent] = usePersist();\n const ref = useRef<HTMLDivElement>(null);\n const {\n id,\n ref: contentRef,\n placement,\n dir,\n } = useComposerFloatingToolbarContext(COMPOSER_FLOATING_TOOLBAR_NAME);\n const mergedRefs = useRefs(forwardedRef, contentRef, ref);\n const [side, align] = useMemo(\n () => getSideAndAlignFromFloatingPlacement(placement),\n [placement]\n );\n const Component = asChild ? Slot : \"div\";\n useAnimationPersist(ref);\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLDivElement>) => {\n onPointerDown?.(event);\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onPointerDown]\n );\n\n return (\n <Component\n dir={dir}\n role=\"toolbar\"\n id={id}\n aria-label=\"Floating toolbar\"\n {...props}\n onPointerDown={handlePointerDown}\n data-state={isPresent ? \"open\" : \"closed\"}\n data-side={side}\n data-align={align}\n style={{\n display: \"flex\",\n flexDirection: \"row\",\n maxWidth: \"var(--lb-composer-floating-available-width)\",\n overflowX: \"auto\",\n ...style,\n }}\n ref={mergedRefs}\n >\n {children}\n </Component>\n );\n});\n\nfunction ComposerEditorElement({\n Mention,\n Link,\n ...props\n}: ComposerEditorElementProps) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { attributes, children, element } = props;\n\n switch (element.type) {\n case \"mention\":\n return (\n <ComposerEditorMentionWrapper\n Mention={Mention}\n {...(props as RenderElementSpecificProps<ComposerBodyMention>)}\n />\n );\n case \"auto-link\":\n case \"custom-link\":\n return (\n <ComposerEditorLinkWrapper\n Link={Link}\n {...(props as RenderElementSpecificProps<\n ComposerBodyAutoLink | ComposerBodyCustomLink\n >)}\n />\n );\n case \"paragraph\":\n return (\n <p {...attributes} style={{ position: \"relative\" }}>\n {children}\n </p>\n );\n default:\n return null;\n }\n}\n\n// <code><s><em><strong>text</strong></s></em></code>\nfunction ComposerEditorLeaf({ attributes, children, leaf }: RenderLeafProps) {\n if (leaf.bold) {\n children = <strong>{children}</strong>;\n }\n\n if (leaf.italic) {\n children = <em>{children}</em>;\n }\n\n if (leaf.strikethrough) {\n children = <s>{children}</s>;\n }\n\n if (leaf.code) {\n children = <code>{children}</code>;\n }\n\n return <span {...attributes}>{children}</span>;\n}\n\nfunction ComposerEditorPlaceholder({\n attributes,\n children,\n}: RenderPlaceholderProps) {\n const { opacity: _opacity, ...style } = attributes.style;\n\n return (\n <span {...attributes} style={style} data-placeholder=\"\">\n {children}\n </span>\n );\n}\n\n/**\n * Displays mentions within `Composer.Editor`.\n *\n * @example\n * <Composer.Mention>@{userId}</Composer.Mention>\n */\nconst ComposerMention = forwardRef<HTMLSpanElement, ComposerMentionProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"span\";\n const isSelected = useSelected();\n\n return (\n <Component\n data-selected={isSelected || undefined}\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n }\n);\n\n/**\n * Displays links within `Composer.Editor`.\n *\n * @example\n * <Composer.Link href={href}>{children}</Composer.Link>\n */\nconst ComposerLink = forwardRef<HTMLAnchorElement, ComposerLinkProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"a\";\n\n return (\n <Component\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n }\n);\n\n/**\n * Contains suggestions within `Composer.Editor`.\n */\nconst ComposerSuggestions = forwardRef<\n HTMLDivElement,\n ComposerSuggestionsProps\n>(({ children, style, asChild, ...props }, forwardedRef) => {\n const [isPresent] = usePersist();\n const ref = useRef<HTMLDivElement>(null);\n const {\n ref: contentRef,\n placement,\n dir,\n } = useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_NAME);\n const mergedRefs = useRefs(forwardedRef, contentRef, ref);\n const [side, align] = useMemo(\n () => getSideAndAlignFromFloatingPlacement(placement),\n [placement]\n );\n const Component = asChild ? Slot : \"div\";\n useAnimationPersist(ref);\n\n return (\n <Component\n dir={dir}\n {...props}\n data-state={isPresent ? \"open\" : \"closed\"}\n data-side={side}\n data-align={align}\n style={{\n display: \"flex\",\n flexDirection: \"column\",\n maxHeight: \"var(--lb-composer-floating-available-height)\",\n overflowY: \"auto\",\n ...style,\n }}\n ref={mergedRefs}\n >\n {children}\n </Component>\n );\n});\n\n/**\n * Displays a list of suggestions within `Composer.Editor`.\n *\n * @example\n * <Composer.SuggestionsList>\n * {userIds.map((userId) => (\n * <Composer.SuggestionsListItem key={userId} value={userId}>\n * @{userId}\n * </Composer.SuggestionsListItem>\n * ))}\n * </Composer.SuggestionsList>\n */\nconst ComposerSuggestionsList = forwardRef<\n HTMLUListElement,\n ComposerSuggestionsListProps\n>(({ children, asChild, ...props }, forwardedRef) => {\n const { id } = useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_NAME);\n const Component = asChild ? Slot : \"ul\";\n\n return (\n <Component\n role=\"listbox\"\n id={id}\n aria-label=\"Suggestions list\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n});\n\n/**\n * Displays a suggestion within `Composer.SuggestionsList`.\n *\n * @example\n * <Composer.SuggestionsListItem key={userId} value={userId}>\n * @{userId}\n * </Composer.SuggestionsListItem>\n */\nconst ComposerSuggestionsListItem = forwardRef<\n HTMLLIElement,\n ComposerSuggestionsListItemProps\n>(\n (\n {\n value,\n children,\n onPointerMove,\n onPointerDown,\n onClick,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const ref = useRef<HTMLLIElement>(null);\n const mergedRefs = useRefs(forwardedRef, ref);\n const { selectedValue, setSelectedValue, itemId, onItemSelect } =\n useComposerSuggestionsContext(COMPOSER_SUGGESTIONS_LIST_ITEM_NAME);\n const Component = asChild ? Slot : \"li\";\n const isSelected = useMemo(\n () => selectedValue === value,\n [selectedValue, value]\n );\n // TODO: Support props.id if provided, it will need to be sent up to Composer.Editor to use it in aria-activedescendant\n const id = useMemo(() => itemId(value), [itemId, value]);\n\n useEffect(() => {\n if (ref?.current && isSelected) {\n ref.current.scrollIntoView({ block: \"nearest\" });\n }\n }, [isSelected]);\n\n const handlePointerMove = useCallback(\n (event: PointerEvent<HTMLLIElement>) => {\n onPointerMove?.(event);\n\n if (!event.isDefaultPrevented()) {\n setSelectedValue(value);\n }\n },\n [onPointerMove, setSelectedValue, value]\n );\n\n const handlePointerDown = useCallback(\n (event: PointerEvent<HTMLLIElement>) => {\n onPointerDown?.(event);\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onPointerDown]\n );\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLLIElement>) => {\n onClick?.(event);\n\n const wasDefaultPrevented = event.isDefaultPrevented();\n\n event.preventDefault();\n event.stopPropagation();\n\n if (!wasDefaultPrevented) {\n onItemSelect(value);\n }\n },\n [onClick, onItemSelect, value]\n );\n\n return (\n <Component\n role=\"option\"\n id={id}\n data-selected={isSelected || undefined}\n aria-selected={isSelected || undefined}\n onPointerMove={handlePointerMove}\n onPointerDown={handlePointerDown}\n onClick={handleClick}\n {...props}\n ref={mergedRefs}\n >\n {children}\n </Component>\n );\n }\n);\n\nconst defaultEditorComponents: ComposerEditorComponents = {\n Link: ({ href, children }) => {\n return <ComposerLink href={href}>{children}</ComposerLink>;\n },\n Mention: ({ userId }) => {\n return (\n <ComposerMention>\n {MENTION_CHARACTER}\n {userId}\n </ComposerMention>\n );\n },\n MentionSuggestions: ({ userIds }) => {\n return userIds.length > 0 ? (\n <ComposerSuggestions>\n <ComposerSuggestionsList>\n {userIds.map((userId) => (\n <ComposerSuggestionsListItem key={userId} value={userId}>\n {userId}\n </ComposerSuggestionsListItem>\n ))}\n </ComposerSuggestionsList>\n </ComposerSuggestions>\n ) : null;\n },\n};\n\n/**\n * Displays the composer's editor.\n *\n * @example\n * <Composer.Editor placeholder=\"Write a comment…\" />\n */\nconst ComposerEditor = forwardRef<HTMLDivElement, ComposerEditorProps>(\n (\n {\n defaultValue,\n onKeyDown,\n onFocus,\n onBlur,\n disabled,\n autoFocus,\n components,\n dir,\n ...props\n },\n forwardedRef\n ) => {\n const client = useClientOrNull();\n const { editor, validate, setFocused, onEditorChange, roomId } =\n useComposerEditorContext();\n const {\n submit,\n focus,\n blur,\n select,\n canSubmit,\n isDisabled: isComposerDisabled,\n isFocused,\n } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const initialBody = useInitial(defaultValue ?? emptyCommentBody);\n const initialEditorValue = useMemo(() => {\n return commentBodyToComposerBody(initialBody);\n }, [initialBody]);\n const { Link, Mention, MentionSuggestions, FloatingToolbar } = useMemo(\n () => ({ ...defaultEditorComponents, ...components }),\n [components]\n );\n\n const [hasFloatingToolbarRange, setHasFloatingToolbarRange] =\n useState(false);\n // If used with LiveblocksProvider but without resolveMentionSuggestions,\n // we can skip the mention suggestions logic entirely\n const resolveMentionSuggestions = useResolveMentionSuggestions();\n const hasResolveMentionSuggestions = client\n ? resolveMentionSuggestions\n : true;\n const [mentionDraft, setMentionDraft] = useState<MentionDraft>();\n const mentionSuggestions = useMentionSuggestions(\n roomId,\n mentionDraft?.text\n );\n const [\n selectedMentionSuggestionIndex,\n setPreviousSelectedMentionSuggestionIndex,\n setNextSelectedMentionSuggestionIndex,\n setSelectedMentionSuggestionIndex,\n ] = useIndex(0, mentionSuggestions?.length ?? 0);\n const id = useId();\n const floatingToolbarId = useMemo(\n () => `liveblocks-floating-toolbar-${id}`,\n [id]\n );\n const suggestionsListId = useMemo(\n () => `liveblocks-suggestions-list-${id}`,\n [id]\n );\n const suggestionsListItemId = useCallback(\n (userId?: string) =>\n userId ? `liveblocks-suggestions-list-item-${id}-${userId}` : undefined,\n [id]\n );\n\n const renderElement = useCallback(\n (props: RenderElementProps) => {\n return (\n <ComposerEditorElement Mention={Mention} Link={Link} {...props} />\n );\n },\n [Link, Mention]\n );\n\n const handleChange = useCallback(\n (value: SlateDescendant[]) => {\n validate(value as SlateElement[]);\n\n // Our multi-component setup requires us to instantiate the editor in `Composer.Form`\n // but we can only listen to changes here in `Composer.Editor` via `Slate`, so we use\n // an event source to notify `Composer.Form` of changes.\n onEditorChange.notify();\n },\n [validate, onEditorChange]\n );\n\n const createMention = useCallback(\n (userId?: string) => {\n if (!mentionDraft || !userId) {\n return;\n }\n\n SlateTransforms.select(editor, mentionDraft.range);\n insertMention(editor, userId);\n setMentionDraft(undefined);\n setSelectedMentionSuggestionIndex(0);\n },\n [editor, mentionDraft, setSelectedMentionSuggestionIndex]\n );\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n // Allow leaving marks with ArrowLeft\n if (isKey(event, \"ArrowLeft\")) {\n leaveMarkEdge(editor, \"start\");\n }\n\n // Allow leaving marks with ArrowRight\n if (isKey(event, \"ArrowRight\")) {\n leaveMarkEdge(editor, \"end\");\n }\n\n if (mentionDraft && mentionSuggestions?.length) {\n // Select the next mention suggestion on ArrowDown\n if (isKey(event, \"ArrowDown\")) {\n event.preventDefault();\n setNextSelectedMentionSuggestionIndex();\n }\n\n // Select the previous mention suggestion on ArrowUp\n if (isKey(event, \"ArrowUp\")) {\n event.preventDefault();\n setPreviousSelectedMentionSuggestionIndex();\n }\n\n // Create a mention on Enter/Tab\n if (isKey(event, \"Enter\") || isKey(event, \"Tab\")) {\n event.preventDefault();\n\n const userId = mentionSuggestions?.[selectedMentionSuggestionIndex];\n createMention(userId);\n }\n\n // Close the suggestions on Escape\n if (isKey(event, \"Escape\")) {\n event.preventDefault();\n setMentionDraft(undefined);\n setSelectedMentionSuggestionIndex(0);\n }\n } else {\n if (hasFloatingToolbarRange) {\n // Close the floating toolbar on Escape\n if (isKey(event, \"Escape\")) {\n event.preventDefault();\n setHasFloatingToolbarRange(false);\n }\n }\n\n // Blur the editor on Escape\n if (isKey(event, \"Escape\")) {\n event.preventDefault();\n blur();\n }\n\n // Submit the editor on Enter\n if (isKey(event, \"Enter\", { shift: false })) {\n // Even if submitting is not possible, don't do anything else on Enter. (e.g. creating a new line)\n event.preventDefault();\n\n if (canSubmit) {\n submit();\n }\n }\n\n // Create a new line on Shift + Enter\n if (isKey(event, \"Enter\", { shift: true })) {\n event.preventDefault();\n editor.insertBreak();\n }\n\n // Toggle bold on Command/Control + B\n if (isKey(event, \"b\", { mod: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"bold\");\n }\n\n // Toggle italic on Command/Control + I\n if (isKey(event, \"i\", { mod: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"italic\");\n }\n\n // Toggle strikethrough on Command/Control + Shift + S\n if (isKey(event, \"s\", { mod: true, shift: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"strikethrough\");\n }\n\n // Toggle code on Command/Control + E\n if (isKey(event, \"e\", { mod: true })) {\n event.preventDefault();\n toggleEditorMark(editor, \"code\");\n }\n }\n },\n [\n onKeyDown,\n mentionDraft,\n mentionSuggestions,\n hasFloatingToolbarRange,\n editor,\n setNextSelectedMentionSuggestionIndex,\n setPreviousSelectedMentionSuggestionIndex,\n selectedMentionSuggestionIndex,\n createMention,\n setSelectedMentionSuggestionIndex,\n blur,\n canSubmit,\n submit,\n ]\n );\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(true);\n }\n },\n [onFocus, setFocused]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(false);\n }\n },\n [onBlur, setFocused]\n );\n\n const selectedMentionSuggestionUserId = useMemo(\n () => mentionSuggestions?.[selectedMentionSuggestionIndex],\n [selectedMentionSuggestionIndex, mentionSuggestions]\n );\n const setSelectedMentionSuggestionUserId = useCallback(\n (userId: string) => {\n const index = mentionSuggestions?.indexOf(userId);\n\n if (index !== undefined && index >= 0) {\n setSelectedMentionSuggestionIndex(index);\n }\n },\n [setSelectedMentionSuggestionIndex, mentionSuggestions]\n );\n\n const additionalProps: AriaAttributes = useMemo(\n () =>\n mentionDraft\n ? {\n role: \"combobox\",\n \"aria-autocomplete\": \"list\",\n \"aria-expanded\": true,\n \"aria-controls\": suggestionsListId,\n \"aria-activedescendant\": suggestionsListItemId(\n selectedMentionSuggestionUserId\n ),\n }\n : hasFloatingToolbarRange\n ? {\n \"aria-haspopup\": true,\n \"aria-controls\": floatingToolbarId,\n }\n : {},\n [\n mentionDraft,\n suggestionsListId,\n suggestionsListItemId,\n selectedMentionSuggestionUserId,\n hasFloatingToolbarRange,\n floatingToolbarId,\n ]\n );\n\n useImperativeHandle(forwardedRef, () => {\n return ReactEditor.toDOMNode(editor, editor) as HTMLDivElement;\n }, [editor]);\n\n // Manually focus the editor when `autoFocus` is true\n useLayoutEffect(() => {\n if (autoFocus) {\n focus();\n }\n }, [autoFocus, editor, focus]);\n\n // Manually add a selection in the editor if the selection\n // is still empty after being focused\n useLayoutEffect(() => {\n if (isFocused && editor.selection === null) {\n select();\n }\n }, [editor, select, isFocused]);\n\n return (\n <Slate\n editor={editor}\n initialValue={initialEditorValue}\n onChange={handleChange}\n >\n <Editable\n dir={dir}\n enterKeyHint={mentionDraft ? \"enter\" : \"send\"}\n autoCapitalize=\"sentences\"\n aria-label=\"Composer editor\"\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n {...additionalProps}\n {...props}\n readOnly={isDisabled}\n disabled={isDisabled}\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n renderElement={renderElement}\n renderLeaf={ComposerEditorLeaf}\n renderPlaceholder={ComposerEditorPlaceholder}\n />\n {hasResolveMentionSuggestions && (\n <ComposerEditorMentionSuggestionsWrapper\n dir={dir}\n mentionDraft={mentionDraft}\n setMentionDraft={setMentionDraft}\n selectedUserId={selectedMentionSuggestionUserId}\n setSelectedUserId={setSelectedMentionSuggestionUserId}\n userIds={mentionSuggestions}\n id={suggestionsListId}\n itemId={suggestionsListItemId}\n onItemSelect={createMention}\n MentionSuggestions={MentionSuggestions}\n />\n )}\n {FloatingToolbar && (\n <ComposerEditorFloatingToolbarWrapper\n dir={dir}\n id={floatingToolbarId}\n hasFloatingToolbarRange={hasFloatingToolbarRange}\n setHasFloatingToolbarRange={setHasFloatingToolbarRange}\n FloatingToolbar={FloatingToolbar}\n />\n )}\n </Slate>\n );\n }\n);\n\nconst MAX_ATTACHMENTS = 10;\nconst MAX_ATTACHMENT_SIZE = 1024 * 1024 * 1024; // 1 GB\n\nfunction prepareAttachment(file: File): CommentLocalAttachment {\n return {\n type: \"localAttachment\",\n status: \"idle\",\n id: createCommentAttachmentId(),\n name: file.name,\n size: file.size,\n mimeType: file.type,\n file,\n };\n}\n\n/**\n * Surrounds the composer's content and handles submissions.\n *\n * @example\n * <Composer.Form onComposerSubmit={({ body }) => {}}>\n *\t <Composer.Editor />\n * <Composer.Submit />\n * </Composer.Form>\n */\nconst ComposerForm = forwardRef<HTMLFormElement, ComposerFormProps>(\n (\n {\n children,\n onSubmit,\n onComposerSubmit,\n defaultAttachments = [],\n pasteFilesAsAttachments,\n preventUnsavedChanges = true,\n disabled,\n asChild,\n roomId: _roomId,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"form\";\n const [isEmpty, setEmpty] = useState(true);\n const [isSubmitting, setSubmitting] = useState(false);\n const [isFocused, setFocused] = useState(false);\n const room = useRoomOrNull();\n\n const roomId = _roomId !== undefined ? _roomId : room?.id;\n if (roomId === undefined) {\n throw new Error(\"Composer.Form must be a descendant of RoomProvider.\");\n }\n\n // Later: Offer as Composer.Form props: { maxAttachments: number; maxAttachmentSize: number; supportedAttachmentMimeTypes: string[]; }\n const maxAttachments = MAX_ATTACHMENTS;\n const maxAttachmentSize = MAX_ATTACHMENT_SIZE;\n\n const {\n attachments,\n isUploadingAttachments,\n addAttachments,\n removeAttachment,\n clearAttachments,\n } = useComposerAttachmentsManager(defaultAttachments, {\n maxFileSize: maxAttachmentSize,\n roomId,\n });\n const numberOfAttachments = attachments.length;\n const hasMaxAttachments = numberOfAttachments >= maxAttachments;\n\n const isDisabled = useMemo(() => {\n return isSubmitting || disabled === true;\n }, [isSubmitting, disabled]);\n const canSubmit = useMemo(() => {\n return !isEmpty && !isUploadingAttachments;\n }, [isEmpty, isUploadingAttachments]);\n const [marks, setMarks] = useState<ComposerBodyMarks>(getMarks);\n\n const ref = useRef<HTMLFormElement>(null);\n const mergedRefs = useRefs(forwardedRef, ref);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const syncSource = useSyncSource();\n\n // Mark the composer as a pending update when it has unsubmitted (draft)\n // text or attachments\n const isPending = !preventUnsavedChanges\n ? false\n : !isEmpty || isUploadingAttachments || attachments.length > 0;\n\n useEffect(() => {\n syncSource?.setSyncStatus(\n isPending ? \"has-local-changes\" : \"synchronized\"\n );\n }, [syncSource, isPending]);\n\n const createAttachments = useCallback(\n (files: File[]) => {\n if (!files.length) {\n return;\n }\n\n const numberOfAcceptedFiles = Math.max(\n 0,\n maxAttachments - numberOfAttachments\n );\n\n files.splice(numberOfAcceptedFiles);\n\n const attachments = files.map((file) => prepareAttachment(file));\n\n addAttachments(attachments);\n },\n [addAttachments, maxAttachments, numberOfAttachments]\n );\n\n const createAttachmentsRef = useRef(createAttachments);\n\n useEffect(() => {\n createAttachmentsRef.current = createAttachments;\n }, [createAttachments]);\n\n const stableCreateAttachments = useCallback((files: File[]) => {\n createAttachmentsRef.current(files);\n }, []);\n\n const editor = useInitial(() =>\n createComposerEditor({\n createAttachments: stableCreateAttachments,\n pasteFilesAsAttachments,\n })\n );\n const onEditorChange = useInitial(makeEventSource) as EventSource<void>;\n\n const validate = useCallback(\n (value: SlateElement[]) => {\n setEmpty(isEditorEmpty(editor, value));\n },\n [editor]\n );\n\n const submit = useCallback(() => {\n if (!canSubmit) {\n return;\n }\n\n // We need to wait for the next frame in some cases like when composing diacritics,\n // we want any native handling to be done first while still being handled on `keydown`.\n requestAnimationFrame(() => {\n if (ref.current) {\n requestSubmit(ref.current);\n }\n });\n }, [canSubmit]);\n\n const clear = useCallback(() => {\n SlateTransforms.delete(editor, {\n at: {\n anchor: SlateEditor.start(editor, []),\n focus: SlateEditor.end(editor, []),\n },\n });\n }, [editor]);\n\n const select = useCallback(() => {\n SlateTransforms.select(editor, SlateEditor.end(editor, []));\n }, [editor]);\n\n const focus = useCallback(\n (resetSelection = true) => {\n if (!ReactEditor.isFocused(editor)) {\n SlateTransforms.select(\n editor,\n resetSelection || !editor.selection\n ? SlateEditor.end(editor, [])\n : editor.selection\n );\n ReactEditor.focus(editor);\n }\n },\n [editor]\n );\n\n const blur = useCallback(() => {\n ReactEditor.blur(editor);\n }, [editor]);\n\n const createMention = useCallback(() => {\n if (disabled) {\n return;\n }\n\n focus();\n insertMentionCharacter(editor);\n }, [disabled, editor, focus]);\n\n const insertText = useCallback(\n (text: string) => {\n if (disabled) {\n return;\n }\n\n focus(false);\n insertSlateText(editor, text);\n },\n [disabled, editor, focus]\n );\n\n const attachFiles = useCallback(() => {\n if (disabled) {\n return;\n }\n\n if (fileInputRef.current) {\n fileInputRef.current.click();\n }\n }, [disabled]);\n\n const handleAttachmentsInputChange = useCallback(\n (event: ChangeEvent<HTMLInputElement>) => {\n if (disabled) {\n return;\n }\n\n if (event.target.files) {\n createAttachments(Array.from(event.target.files));\n\n // Reset the input value to allow selecting the same file(s) again\n event.target.value = \"\";\n }\n },\n [createAttachments, disabled]\n );\n\n const onSubmitEnd = useCallback(() => {\n clear();\n blur();\n clearAttachments();\n setSubmitting(false);\n }, [blur, clear, clearAttachments]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n if (disabled) {\n return;\n }\n\n // In some situations (e.g. pressing Enter while composing diacritics), it's possible\n // for the form to be submitted as empty even though we already checked whether the\n // editor was empty when handling the key press.\n const isEmpty = isEditorEmpty(editor, editor.children);\n\n // We even prevent the user's `onSubmit` handler from being called if the editor is empty.\n if (isEmpty) {\n event.preventDefault();\n\n return;\n }\n\n onSubmit?.(event);\n\n if (!onComposerSubmit || event.isDefaultPrevented()) {\n event.preventDefault();\n\n return;\n }\n\n const body = composerBodyToCommentBody(\n editor.children as ComposerBodyData\n );\n // Only non-local attachments are included to be submitted.\n const commentAttachments: CommentAttachment[] = attachments\n .filter(\n (attachment) =>\n attachment.type === \"attachment\" ||\n (attachment.type === \"localAttachment\" &&\n attachment.status === \"uploaded\")\n )\n .map((attachment) => {\n return {\n id: attachment.id,\n type: \"attachment\",\n mimeType: attachment.mimeType,\n size: attachment.size,\n name: attachment.name,\n };\n });\n\n const promise = onComposerSubmit(\n { body, attachments: commentAttachments },\n event\n );\n\n event.preventDefault();\n\n if (promise) {\n setSubmitting(true);\n promise.then(onSubmitEnd);\n } else {\n onSubmitEnd();\n }\n },\n [disabled, editor, attachments, onComposerSubmit, onSubmit, onSubmitEnd]\n );\n\n const stopPropagation = useCallback((event: SyntheticEvent) => {\n event.stopPropagation();\n }, []);\n\n const toggleMark = useCallback(\n (mark: ComposerBodyMark) => {\n toggleEditorMark(editor, mark);\n },\n [editor]\n );\n\n useObservable(onEditorChange, () => {\n setMarks(getMarks(editor));\n });\n\n return (\n <ComposerEditorContext.Provider\n value={{\n editor,\n validate,\n setFocused,\n onEditorChange,\n roomId,\n }}\n >\n <ComposerAttachmentsContext.Provider\n value={{\n createAttachments,\n isUploadingAttachments,\n hasMaxAttachments,\n maxAttachments,\n maxAttachmentSize,\n }}\n >\n <ComposerContext.Provider\n value={{\n isDisabled,\n isFocused,\n isEmpty,\n canSubmit,\n submit,\n clear,\n select,\n focus,\n blur,\n createMention,\n insertText,\n attachments,\n attachFiles,\n removeAttachment,\n toggleMark,\n marks,\n }}\n >\n <Component {...props} onSubmit={handleSubmit} ref={mergedRefs}>\n <input\n type=\"file\"\n multiple\n ref={fileInputRef}\n onChange={handleAttachmentsInputChange}\n onClick={stopPropagation}\n tabIndex={-1}\n style={{ display: \"none\" }}\n />\n <Slottable>{children}</Slottable>\n </Component>\n </ComposerContext.Provider>\n </ComposerAttachmentsContext.Provider>\n </ComposerEditorContext.Provider>\n );\n }\n);\n\n/**\n * A button to submit the composer.\n *\n * @example\n * <Composer.Submit>Send</Composer.Submit>\n */\nconst ComposerSubmit = forwardRef<HTMLButtonElement, ComposerSubmitProps>(\n ({ children, disabled, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { canSubmit, isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled || !canSubmit;\n\n return (\n <Component\n type=\"submit\"\n {...props}\n ref={forwardedRef}\n disabled={isDisabled}\n >\n {children}\n </Component>\n );\n }\n);\n\n/**\n * A button which opens a file picker to create attachments.\n *\n * @example\n * <Composer.AttachFiles>Attach files</Composer.AttachFiles>\n */\nconst ComposerAttachFiles = forwardRef<\n HTMLButtonElement,\n ComposerAttachFilesProps\n>(({ children, onClick, disabled, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { hasMaxAttachments } = useComposerAttachmentsContext();\n const { isDisabled: isComposerDisabled, attachFiles } = useComposer();\n const isDisabled = isComposerDisabled || hasMaxAttachments || disabled;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (!event.isDefaultPrevented()) {\n attachFiles();\n }\n },\n [attachFiles, onClick]\n );\n\n return (\n <Component\n type=\"button\"\n {...props}\n onClick={handleClick}\n ref={forwardedRef}\n disabled={isDisabled}\n >\n {children}\n </Component>\n );\n});\n\n/**\n * A drop area which accepts files to create attachments.\n *\n * @example\n * <Composer.AttachmentsDropArea>\n * Drop files here\n * </Composer.AttachmentsDropArea>\n */\nconst ComposerAttachmentsDropArea = forwardRef<\n HTMLDivElement,\n ComposerAttachmentsDropAreaProps\n>(\n (\n {\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"div\";\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const [, dropAreaProps] = useComposerAttachmentsDropArea({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled: isDisabled,\n });\n\n return (\n <Component\n {...dropAreaProps}\n data-disabled={isDisabled ? \"\" : undefined}\n {...props}\n ref={forwardedRef}\n />\n );\n }\n);\n\n/**\n * A toggle button which toggles a specific text mark.\n *\n * @example\n * <Composer.MarkToggle mark=\"bold\">\n * Bold\n * </Composer.MarkToggle>\n */\nconst ComposerMarkToggle = forwardRef<\n HTMLButtonElement,\n ComposerMarkToggleProps\n>(\n (\n { children, mark, onValueChange, onClick, asChild, ...props },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"button\";\n const { marks, toggleMark } = useComposer();\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (!event.isDefaultPrevented()) {\n toggleMark(mark);\n onValueChange?.(mark);\n }\n },\n [mark, onClick, onValueChange, toggleMark]\n );\n\n return (\n <TogglePrimitive.Root\n asChild\n pressed={marks[mark]}\n onClick={handleClick}\n {...props}\n >\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n </TogglePrimitive.Root>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n ComposerAttachFiles.displayName = COMPOSER_ATTACH_FILES_NAME;\n ComposerAttachmentsDropArea.displayName = COMPOSER_ATTACHMENTS_DROP_AREA_NAME;\n ComposerEditor.displayName = COMPOSER_EDITOR_NAME;\n ComposerFloatingToolbar.displayName = COMPOSER_FLOATING_TOOLBAR_NAME;\n ComposerForm.displayName = COMPOSER_FORM_NAME;\n ComposerMention.displayName = COMPOSER_MENTION_NAME;\n ComposerLink.displayName = COMPOSER_LINK_NAME;\n ComposerSubmit.displayName = COMPOSER_SUBMIT_NAME;\n ComposerSuggestions.displayName = COMPOSER_SUGGESTIONS_NAME;\n ComposerSuggestionsList.displayName = COMPOSER_SUGGESTIONS_LIST_NAME;\n ComposerSuggestionsListItem.displayName = COMPOSER_SUGGESTIONS_LIST_ITEM_NAME;\n ComposerMarkToggle.displayName = COMPOSER_MARK_TOGGLE_NAME;\n}\n\n// NOTE: Every export from this file will be available publicly as Composer.*\nexport {\n ComposerAttachFiles as AttachFiles,\n ComposerAttachmentsDropArea as AttachmentsDropArea,\n ComposerEditor as Editor,\n ComposerFloatingToolbar as FloatingToolbar,\n ComposerForm as Form,\n ComposerLink as Link,\n ComposerMarkToggle as MarkToggle,\n ComposerMention as Mention,\n ComposerSubmit as Submit,\n ComposerSuggestions as Suggestions,\n ComposerSuggestionsList as SuggestionsList,\n ComposerSuggestionsListItem as SuggestionsListItem,\n};\n"],"names":["SlateRange","props","SlateTransforms","toggleEditorMark","isEmpty","attachments","isEditorEmpty","SlateEditor","insertText","insertSlateText","toggleMark"],"mappings":"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"}
|
|
@@ -269,9 +269,10 @@ function useComposerAttachmentsDropArea({
|
|
|
269
269
|
];
|
|
270
270
|
}
|
|
271
271
|
class AttachmentTooLargeError extends Error {
|
|
272
|
+
origin;
|
|
273
|
+
name = "AttachmentTooLargeError";
|
|
272
274
|
constructor(message, origin = "client") {
|
|
273
275
|
super(message);
|
|
274
|
-
this.name = "AttachmentTooLargeError";
|
|
275
276
|
this.origin = origin;
|
|
276
277
|
}
|
|
277
278
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport { HttpError, kInternal, makeEventSource } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport { isComposerBodyAutoLink } from \"../../slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"../../slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"../../slate/plugins/mentions\";\nimport { isText } from \"../../slate/utils/is-text\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useLatest } from \"../../utils/use-latest\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n} from \"../Comment/utils\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n };\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline","isComposerBodyMention","isComposerBodyAutoLink","isComposerBodyCustomLink","isText","exists","isCommentBodyMention","isCommentBodyLink","isCommentBodyText","useState","useCallback","useLayoutEffect","useMemo","FLOATING_ELEMENT_COLLISION_PADDING","flip","hide","shift","limitShift","offset","FLOATING_ELEMENT_SIDE_OFFSET","size","autoUpdate","useFloating","useComposer","useComposerAttachmentsContext","useLatest","getFiles","makeEventSource","kInternal","HttpError","useClient","useInitial","useEffect","useSyncExternalStore"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"utils.js","sources":["../../../src/primitives/Composer/utils.ts"],"sourcesContent":["import type {\n DetectOverflowOptions,\n Placement,\n UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport {\n autoUpdate,\n flip,\n hide,\n inline,\n limitShift,\n offset,\n shift,\n size,\n useFloating,\n} from \"@floating-ui/react-dom\";\nimport type {\n Client,\n CommentAttachment,\n CommentBody,\n CommentBodyLink,\n CommentBodyMention,\n CommentLocalAttachment,\n CommentMixedAttachment,\n} from \"@liveblocks/core\";\nimport { HttpError, kInternal, makeEventSource } from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport type { DragEvent } from \"react\";\nimport {\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useState,\n useSyncExternalStore,\n} from \"react\";\n\nimport {\n FLOATING_ELEMENT_COLLISION_PADDING,\n FLOATING_ELEMENT_SIDE_OFFSET,\n} from \"../../constants\";\nimport { isComposerBodyAutoLink } from \"../../slate/plugins/auto-links\";\nimport { isComposerBodyCustomLink } from \"../../slate/plugins/custom-links\";\nimport { isComposerBodyMention } from \"../../slate/plugins/mentions\";\nimport { isText } from \"../../slate/utils/is-text\";\nimport type {\n ComposerBody,\n ComposerBodyAutoLink,\n ComposerBodyCustomLink,\n ComposerBodyMention,\n ComposerBodyText,\n Direction,\n} from \"../../types\";\nimport { getFiles } from \"../../utils/data-transfer\";\nimport { exists } from \"../../utils/exists\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { useLatest } from \"../../utils/use-latest\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n isCommentBodyText,\n} from \"../Comment/utils\";\nimport { useComposer, useComposerAttachmentsContext } from \"./contexts\";\nimport type { FloatingAlignment, FloatingPosition } from \"./types\";\n\nexport function composerBodyMentionToCommentBodyMention(\n mention: ComposerBodyMention\n): CommentBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n };\n}\n\nexport function composerBodyAutoLinkToCommentBodyLink(\n link: ComposerBodyAutoLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n };\n}\n\nexport function composerBodyCustomLinkToCommentBodyLink(\n link: ComposerBodyCustomLink\n): CommentBodyLink {\n return {\n type: \"link\",\n url: link.url,\n text: link.children.map((child) => child.text).join(\"\"),\n };\n}\n\nexport function commentBodyMentionToComposerBodyMention(\n mention: CommentBodyMention\n): ComposerBodyMention {\n return {\n type: \"mention\",\n id: mention.id,\n children: [{ text: \"\" }],\n };\n}\n\nexport function commentBodyLinkToComposerBodyLink(\n link: CommentBodyLink\n): ComposerBodyAutoLink | ComposerBodyCustomLink {\n if (link.text) {\n return {\n type: \"custom-link\",\n url: link.url,\n children: [{ text: link.text }],\n };\n } else {\n return {\n type: \"auto-link\",\n url: link.url,\n children: [{ text: link.url }],\n };\n }\n}\n\nexport function composerBodyToCommentBody(body: ComposerBody): CommentBody {\n return {\n version: 1,\n content: body\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isComposerBodyMention(inline)) {\n return composerBodyMentionToCommentBodyMention(inline);\n }\n\n if (isComposerBodyAutoLink(inline)) {\n return composerBodyAutoLinkToCommentBodyLink(inline);\n }\n\n if (isComposerBodyCustomLink(inline)) {\n return composerBodyCustomLinkToCommentBodyLink(inline);\n }\n\n if (isText(inline)) {\n return inline;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists),\n };\n}\n\nconst emptyComposerBody: ComposerBody = [];\n\nexport function commentBodyToComposerBody(body: CommentBody): ComposerBody {\n if (!body || !body?.content) {\n return emptyComposerBody;\n }\n\n return body.content\n .map((block) => {\n // All root blocks are paragraphs at the moment\n if (block.type !== \"paragraph\") {\n return null;\n }\n\n const children = block.children\n .map((inline) => {\n if (isCommentBodyMention(inline)) {\n return commentBodyMentionToComposerBodyMention(inline);\n }\n\n if (isCommentBodyLink(inline)) {\n return commentBodyLinkToComposerBodyLink(inline);\n }\n\n if (isCommentBodyText(inline)) {\n return inline as ComposerBodyText;\n }\n\n return null;\n })\n .filter(exists);\n\n return {\n ...block,\n children,\n };\n })\n .filter(exists);\n}\n\nexport function getRtlFloatingAlignment(\n alignment: FloatingAlignment\n): FloatingAlignment {\n switch (alignment) {\n case \"start\":\n return \"end\";\n case \"end\":\n return \"start\";\n default:\n return \"center\";\n }\n}\n\nexport function getSideAndAlignFromFloatingPlacement(placement: Placement) {\n const [side, align = \"center\"] = placement.split(\"-\");\n\n return [side, align] as const;\n}\n\n// Copy `z-index` from content to wrapper.\n// Inspired by https://github.com/radix-ui/primitives/blob/main/packages/react/popper/src/Popper.tsx\nexport function useContentZIndex() {\n const [content, setContent] = useState<HTMLDivElement | null>(null);\n const contentRef = useCallback(setContent, [setContent]);\n const [contentZIndex, setContentZIndex] = useState<string>();\n\n useLayoutEffect(() => {\n if (content) {\n setContentZIndex(window.getComputedStyle(content).zIndex);\n }\n }, [content]);\n\n return [contentRef, contentZIndex] as const;\n}\n\nexport function useFloatingWithOptions({\n type = \"bounds\",\n position,\n alignment,\n dir,\n open,\n}: {\n type?: \"bounds\" | \"range\";\n position: FloatingPosition;\n alignment: FloatingAlignment;\n dir: Direction | undefined;\n open: boolean;\n}) {\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: FLOATING_ELEMENT_COLLISION_PADDING,\n };\n\n const middleware = [\n type === \"range\" ? inline(detectOverflowOptions) : null,\n flip({ ...detectOverflowOptions, crossAxis: false }),\n hide(detectOverflowOptions),\n shift({\n ...detectOverflowOptions,\n limiter: limitShift(),\n }),\n type === \"range\" ? offset(FLOATING_ELEMENT_SIDE_OFFSET) : null,\n size({\n ...detectOverflowOptions,\n apply({ availableWidth, availableHeight, elements }) {\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-width\",\n `${availableWidth}px`\n );\n elements.floating.style.setProperty(\n \"--lb-composer-floating-available-height\",\n `${availableHeight}px`\n );\n },\n }),\n ];\n\n return {\n strategy: \"fixed\",\n placement:\n alignment === \"center\"\n ? position\n : (`${position}-${dir === \"rtl\" ? getRtlFloatingAlignment(alignment) : alignment}` as Placement),\n middleware,\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [alignment, position, dir, type]);\n\n return useFloating({\n ...floatingOptions,\n open,\n });\n}\n\nexport function useComposerAttachmentsDropArea<\n T extends HTMLElement = HTMLElement,\n>({\n onDragEnter,\n onDragLeave,\n onDragOver,\n onDrop,\n disabled,\n}: {\n onDragEnter?: (event: DragEvent<T>) => void;\n onDragLeave?: (event: DragEvent<T>) => void;\n onDragOver?: (event: DragEvent<T>) => void;\n onDrop?: (event: DragEvent<T>) => void;\n disabled?: boolean;\n}) {\n const { isDisabled: isComposerDisabled } = useComposer();\n const isDisabled = isComposerDisabled || disabled;\n const { createAttachments } = useComposerAttachmentsContext();\n const [isDraggingOver, setDraggingOver] = useState(false);\n const latestIsDraggingOver = useLatest(isDraggingOver);\n\n const handleDragEnter = useCallback(\n (event: DragEvent<T>) => {\n onDragEnter?.(event);\n\n if (\n latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n const dataTransfer = event.dataTransfer;\n\n if (!dataTransfer.types.includes(\"Files\")) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(true);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragEnter, isDisabled]\n );\n\n const handleDragLeave = useCallback(\n (event: DragEvent<T>) => {\n onDragLeave?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n // Ignore drag leave events that are not actually leaving the drop area\n if (\n event.relatedTarget\n ? event.relatedTarget === event.currentTarget ||\n event.currentTarget.contains(event.relatedTarget as HTMLElement)\n : event.currentTarget !== event.target\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDragLeave, isDisabled]\n );\n\n const handleDragOver = useCallback(\n (event: DragEvent<T>) => {\n onDragOver?.(event);\n\n if (isDisabled || event.isDefaultPrevented()) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n },\n [onDragOver, isDisabled]\n );\n\n const handleDrop = useCallback(\n (event: DragEvent<T>) => {\n onDrop?.(event);\n\n if (\n !latestIsDraggingOver.current ||\n isDisabled ||\n event.isDefaultPrevented()\n ) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n\n setDraggingOver(false);\n\n const files = getFiles(event.dataTransfer);\n\n createAttachments(files);\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [onDrop, isDisabled, createAttachments]\n );\n\n return [\n isDraggingOver,\n {\n onDragEnter: handleDragEnter,\n onDragLeave: handleDragLeave,\n onDragOver: handleDragOver,\n onDrop: handleDrop,\n \"data-drop\": isDraggingOver ? \"\" : undefined,\n \"data-disabled\": isDisabled ? \"\" : undefined,\n } as const,\n ] as const;\n}\n\ninterface ComposerAttachmentsManagerOptions {\n maxFileSize: number;\n roomId: string;\n}\n\nexport class AttachmentTooLargeError extends Error {\n origin: \"client\" | \"server\";\n name = \"AttachmentTooLargeError\";\n\n constructor(message: string, origin: \"client\" | \"server\" = \"client\") {\n super(message);\n this.origin = origin;\n }\n}\n\nfunction createComposerAttachmentsManager(\n client: Client,\n roomId: string,\n options: ComposerAttachmentsManagerOptions\n) {\n const attachments: Map<string, CommentMixedAttachment> = new Map();\n const abortControllers: Map<string, AbortController> = new Map();\n const eventSource = makeEventSource<void>();\n let cachedSnapshot: CommentMixedAttachment[] | null = null;\n\n function notifySubscribers() {\n // Invalidate the cached snapshot\n cachedSnapshot = null;\n eventSource.notify();\n }\n\n function uploadAttachment(attachment: CommentLocalAttachment) {\n const abortController = new AbortController();\n abortControllers.set(attachment.id, abortController);\n\n client[kInternal].httpClient\n .uploadAttachment({\n roomId,\n attachment,\n signal: abortController.signal,\n })\n .then(() => {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploaded\",\n });\n notifySubscribers();\n })\n .catch((error) => {\n if (\n error instanceof Error &&\n error.name !== \"AbortError\" &&\n error.name !== \"TimeoutError\"\n ) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error:\n error instanceof HttpError && error.status === 413\n ? new AttachmentTooLargeError(\"File is too large.\", \"server\")\n : error,\n });\n notifySubscribers();\n }\n });\n }\n\n function addAttachments(addedAttachments: CommentMixedAttachment[]) {\n if (addedAttachments.length === 0) {\n return;\n }\n\n // Ignore attachments that are already in the manager\n const newAttachments = addedAttachments.filter(\n (attachment) => !attachments.has(attachment.id)\n );\n\n const attachmentsToUpload: CommentLocalAttachment[] = [];\n\n // Add all the new attachments to the manager\n for (const attachment of newAttachments) {\n if (attachment.type === \"localAttachment\") {\n // The file is too large to be uploaded\n if (attachment.file.size > options.maxFileSize) {\n attachments.set(attachment.id, {\n ...attachment,\n status: \"error\",\n error: new AttachmentTooLargeError(\"File is too large.\", \"client\"),\n });\n\n continue;\n }\n\n // Otherwise, mark the attachment to be uploaded\n attachments.set(attachment.id, {\n ...attachment,\n status: \"uploading\",\n });\n attachmentsToUpload.push(attachment);\n } else {\n attachments.set(attachment.id, attachment);\n }\n }\n\n // Notify subscribers about the new attachments that were added\n if (newAttachments.length > 0) {\n notifySubscribers();\n }\n\n // Upload all the new local attachments\n for (const attachment of attachmentsToUpload) {\n uploadAttachment(attachment);\n }\n }\n\n function removeAttachment(attachmentId: string) {\n const abortController = abortControllers.get(attachmentId);\n\n abortController?.abort();\n\n attachments.delete(attachmentId);\n abortControllers.delete(attachmentId);\n\n notifySubscribers();\n }\n\n function getSnapshot() {\n if (!cachedSnapshot) {\n cachedSnapshot = Array.from(attachments.values());\n }\n\n return cachedSnapshot;\n }\n\n // Clear all attachments and abort all ongoing uploads\n function clear() {\n abortControllers.forEach((controller) => controller.abort());\n abortControllers.clear();\n attachments.clear();\n\n notifySubscribers();\n }\n\n return {\n addAttachments,\n removeAttachment,\n getSnapshot,\n subscribe: eventSource.subscribe,\n clear,\n };\n}\n\nfunction preventBeforeUnloadDefault(event: BeforeUnloadEvent) {\n event.preventDefault();\n}\n\nexport function useComposerAttachmentsManager(\n defaultAttachments: CommentAttachment[],\n options: ComposerAttachmentsManagerOptions\n) {\n const client = useClient();\n const frozenDefaultAttachments = useInitial(defaultAttachments);\n const frozenAttachmentsManager = useInitial(() =>\n createComposerAttachmentsManager(client, options.roomId, options)\n );\n\n // Initialize default attachments on mount\n useEffect(() => {\n frozenAttachmentsManager.addAttachments(frozenDefaultAttachments);\n }, [frozenDefaultAttachments, frozenAttachmentsManager]);\n\n // Clear on unmount\n useEffect(() => {\n return () => {\n frozenAttachmentsManager.clear();\n };\n }, [frozenAttachmentsManager]);\n\n const attachments = useSyncExternalStore(\n frozenAttachmentsManager.subscribe,\n frozenAttachmentsManager.getSnapshot,\n frozenAttachmentsManager.getSnapshot\n );\n\n const isUploadingAttachments = useMemo(() => {\n return attachments.some(\n (attachment) =>\n attachment.type === \"localAttachment\" &&\n attachment.status === \"uploading\"\n );\n }, [attachments]);\n\n useEffect(() => {\n if (!isUploadingAttachments) {\n return;\n }\n\n window.addEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n\n return () => {\n window.removeEventListener(\"beforeunload\", preventBeforeUnloadDefault);\n };\n }, [isUploadingAttachments]);\n\n return {\n attachments,\n isUploadingAttachments,\n addAttachments: frozenAttachmentsManager.addAttachments,\n removeAttachment: frozenAttachmentsManager.removeAttachment,\n clearAttachments: frozenAttachmentsManager.clear,\n };\n}\n"],"names":["inline","isComposerBodyMention","isComposerBodyAutoLink","isComposerBodyCustomLink","isText","exists","isCommentBodyMention","isCommentBodyLink","isCommentBodyText","useState","useCallback","useLayoutEffect","useMemo","FLOATING_ELEMENT_COLLISION_PADDING","flip","hide","shift","limitShift","offset","FLOATING_ELEMENT_SIDE_OFFSET","size","autoUpdate","useFloating","useComposer","useComposerAttachmentsContext","useLatest","getFiles","makeEventSource","kInternal","HttpError","useClient","useInitial","useEffect","useSyncExternalStore"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { inline, flip, hide, shift, limitShift, offset, size, autoUpdate, useFloating } from '@floating-ui/react-dom';
|
|
2
2
|
import { makeEventSource, kInternal, HttpError } from '@liveblocks/core';
|
|
3
3
|
import { useClient } from '@liveblocks/react';
|
|
4
|
-
import { useState, useCallback,
|
|
5
|
-
import {
|
|
4
|
+
import { useState, useCallback, useLayoutEffect, useMemo, useEffect, useSyncExternalStore } from 'react';
|
|
5
|
+
import { FLOATING_ELEMENT_COLLISION_PADDING, FLOATING_ELEMENT_SIDE_OFFSET } from '../../constants.mjs';
|
|
6
6
|
import { isComposerBodyAutoLink } from '../../slate/plugins/auto-links.mjs';
|
|
7
7
|
import { isComposerBodyCustomLink } from '../../slate/plugins/custom-links.mjs';
|
|
8
8
|
import { isComposerBodyMention } from '../../slate/plugins/mentions.mjs';
|
|
@@ -267,9 +267,10 @@ function useComposerAttachmentsDropArea({
|
|
|
267
267
|
];
|
|
268
268
|
}
|
|
269
269
|
class AttachmentTooLargeError extends Error {
|
|
270
|
+
origin;
|
|
271
|
+
name = "AttachmentTooLargeError";
|
|
270
272
|
constructor(message, origin = "client") {
|
|
271
273
|
super(message);
|
|
272
|
-
this.name = "AttachmentTooLargeError";
|
|
273
274
|
this.origin = origin;
|
|
274
275
|
}
|
|
275
276
|
}
|