@box/threaded-annotations 4.10.5 → 4.11.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/chunks/message-editor2.module.js +1 -1
- package/dist/chunks/text-message.module.js +1 -1
- package/dist/chunks/threaded-annotations2.js +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/lib/components/v2/message-editor/editor-extensions/create-message-editor-extensions.js +1 -1
- package/dist/esm/lib/components/v2/message-editor/editor-extensions/custom-underline.js +1 -0
- package/dist/esm/lib/components/v2/message-editor/message-editor.js +1 -1
- package/dist/esm/lib/v2/utils/merge-mention-into-draft.js +1 -0
- package/dist/esm/lib/v2/utils/parse-message-markdown.js +2 -0
- package/dist/esm/lib/v2/utils/serialize-message-to-markdown.js +4 -0
- package/dist/esm/lib/v2/utils/underline-markdown-it-plugin.js +1 -0
- package/dist/styles/message-editor2.css +1 -1
- package/dist/styles/text-message2.css +1 -1
- package/dist/types/index.d.ts +2 -0
- package/dist/types/lib/components/v2/message-editor/editor-extensions/custom-underline.d.ts +5 -0
- package/dist/types/lib/components/v2/message-editor/message-editor.types.d.ts +2 -0
- package/dist/types/lib/v2/utils/merge-mention-into-draft.d.ts +3 -0
- package/dist/types/lib/v2/utils/parse-message-markdown.d.ts +6 -0
- package/dist/types/lib/v2/utils/serialize-message-to-markdown.d.ts +9 -0
- package/dist/types/lib/v2/utils/underline-markdown-it-plugin.d.ts +2 -0
- package/package.json +14 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
import '../styles/message-editor2.css';var message_editor_module_default={messageEditorWrapper:`
|
|
1
|
+
import '../styles/message-editor2.css';var message_editor_module_default={messageEditorWrapper:`_messageEditorWrapper_oercc_29`,editActionsColumn:`_editActionsColumn_oercc_34`,editActionsRow:`_editActionsRow_oercc_41`,characterLimitCounter:`_characterLimitCounter_oercc_47`,messageEditor:`_messageEditor_oercc_29`,editorEditMode:`_editorEditMode_oercc_65`,editorFirstAnnotation:`_editorFirstAnnotation_oercc_72`,editorError:`_editorError_oercc_72`,editorViewport:`_editorViewport_oercc_80`,editorContainer:`_editorContainer_oercc_86`,editor:`_editor_oercc_65`,editorFade:`_editorFade_oercc_176`,editorFadeHidden:`_editorFadeHidden_oercc_187`,editorFullWidth:`_editorFullWidth_oercc_190`,actionsWrapper:`_actionsWrapper_oercc_194`,actionsWrapperInner:`_actionsWrapperInner_oercc_204`,timestampToggle:`_timestampToggle_oercc_211`,errorMessage:`_errorMessage_oercc_214`,errorText:`_errorText_oercc_223`,editorHasScroll:`_editorHasScroll_oercc_232`,editorCharacterLimitExceeded:`_editorCharacterLimitExceeded_oercc_243`,characterLimitExceeded:`_characterLimitExceeded_oercc_265`,scrolledToBottom:`_scrolledToBottom_oercc_268`,anchorElement:`_anchorElement_oercc_272`,withTimestampToggle:`_withTimestampToggle_oercc_281`};export{message_editor_module_default as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import '../styles/text-message2.css';var text_message_module_default={textMessage:`
|
|
1
|
+
import '../styles/text-message2.css';var text_message_module_default={textMessage:`_textMessage_g9go2_29`,contentWrapper:`_contentWrapper_g9go2_38`,threadedIndicator:`_threadedIndicator_g9go2_43`,threadedIndicatorHidden:`_threadedIndicatorHidden_g9go2_59`,messageContent:`_messageContent_g9go2_62`,inlineEditSlot:`_inlineEditSlot_g9go2_99`,annotationBadgeWrapper:`_annotationBadgeWrapper_g9go2_102`,messageFooter:`_messageFooter_g9go2_111`,readableTimeWrapper:`_readableTimeWrapper_g9go2_119`,replyButton:`_replyButton_g9go2_123`,seeMoreButton:`_seeMoreButton_g9go2_138`,richTextList:`_richTextList_g9go2_142`};export{text_message_module_default as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{THREADED_ANNOTATIONS_PORTAL}from"../esm/lib/v2/constants.js";import{MessageEditor}from"../esm/lib/components/v2/message-editor/message-editor.js";import{ThreadViewState,ThreadedAnnotationsProvider,useThreadedAnnotationsContext}from"../esm/lib/v2/threaded-annotations-context.js";import{t as MessagesView}from"./messages-view.js";import{buildMentionContent}from"../esm/lib/v2/utils/build-mention-content.js";import clsx from"clsx";import{useCallback,useEffect,useMemo,useRef}from"react";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/threaded-annotations2.css';var threaded_annotations_module_default={threadedAnnotations:`_threadedAnnotations_x0zhn_1`,expandable:`_expandable_x0zhn_13`,annotations:`_annotations_x0zhn_21`,highlighted:`_highlighted_x0zhn_21`},ThreadedAnnotationsContent=({messages:messageList,isResolved=!1,resolvedBy,resolvedAt,maxCharacterCount,onDelete,onThreadDelete,onAvatarClick,onCopyLink,onEdit,onEditError,onResolve,onUnresolve,onPost,onPostError,isRichTextEnabled=!1,onFormatToggle,userSelectorProps,onEditorOpenChange,annotationTarget,onAnnotationBadgeClick,originalContentDeleted,isHighlighted=!1,autoFocusReplyEditor=!0})=>{let{viewState,dispatch,editingMessageId,replyMention,isReplyDisabled,isAnnotations}=useThreadedAnnotationsContext(),containerRef=useRef(null),isExpanded=viewState!==ThreadViewState.Collapsed,hasHiddenReplies=messageList.length>2,isExpandable=viewState===ThreadViewState.Collapsed&&(hasHiddenReplies||!isReplyDisabled&&!isResolved);useEffect(()=>{editingMessageId&&!messageList.some(message=>message.id===editingMessageId)&&dispatch({type:`CLEAR_EDIT`})},[editingMessageId,messageList,dispatch]),useEffect(()=>{onEditorOpenChange?.(isExpanded)},[isExpanded,onEditorOpenChange]),useEffect(()=>{if(!isExpanded)return;let portalSelector=`[${Object.keys(THREADED_ANNOTATIONS_PORTAL)[0]}]`,handleClickOutside=e=>{let target=e.target;containerRef.current?.contains(target)||document.querySelector(portalSelector)?.contains(target)||dispatch({type:`COLLAPSE`})};return document.addEventListener(`mousedown`,handleClickOutside),()=>document.removeEventListener(`mousedown`,handleClickOutside)},[isExpanded,dispatch]);let hasNoMessages=messageList.length===0,handleClearMention=useCallback(()=>dispatch({type:`CLEAR_MENTION`}),[dispatch]),initialReplyContent=useMemo(()=>replyMention?buildMentionContent(replyMention):null,[replyMention]),handleClick=useCallback(e=>{if(!isExpandable)return;let target=e.target;!e.currentTarget.contains(target)||target.closest(`[data-no-expand]`)||dispatch({type:`EXPAND`})},[isExpandable,dispatch]);return isAnnotations&&hasNoMessages?jsx(MessageEditor,{isFirstAnnotation:!0,isRichTextEnabled,maxCharacterCount,onFormatToggle,onPost,onPostError,onPostSuccess:handleClearMention,userSelectorProps}):jsxs(`div`,{ref:containerRef,className:clsx(threaded_annotations_module_default.threadedAnnotations,isExpandable&&threaded_annotations_module_default.expandable,isAnnotations&&threaded_annotations_module_default.annotations,isHighlighted&&threaded_annotations_module_default.highlighted),"data-thread-expandable":isExpandable?!0:void 0,"data-thread-highlighted":isHighlighted?!0:void 0,onClick:isExpandable?handleClick:void 0,children:[jsx(MessagesView,{messages:messageList,isResolved,resolvedBy,resolvedAt,maxCharacterCount,onDelete,onThreadDelete,onAvatarClick,onCopyLink,onEdit,onEditError,onResolve,onUnresolve,isRichTextEnabled,onFormatToggle,userSelectorProps,annotationTarget,onAnnotationBadgeClick,originalContentDeleted}),viewState===ThreadViewState.Composing&&jsx(MessageEditor,{autoFocus:autoFocusReplyEditor,initialContent:initialReplyContent,isRichTextEnabled,maxCharacterCount,onFormatToggle,onPost,onPostError,onPostSuccess:
|
|
1
|
+
import{THREADED_ANNOTATIONS_PORTAL}from"../esm/lib/v2/constants.js";import{MessageEditor}from"../esm/lib/components/v2/message-editor/message-editor.js";import{ThreadViewState,ThreadedAnnotationsProvider,useThreadedAnnotationsContext}from"../esm/lib/v2/threaded-annotations-context.js";import{t as MessagesView}from"./messages-view.js";import{buildMentionContent}from"../esm/lib/v2/utils/build-mention-content.js";import{mergeMentionIntoDraft}from"../esm/lib/v2/utils/merge-mention-into-draft.js";import clsx from"clsx";import{useCallback,useEffect,useMemo,useRef}from"react";import{jsx,jsxs}from"react/jsx-runtime";import '../styles/threaded-annotations2.css';var threaded_annotations_module_default={threadedAnnotations:`_threadedAnnotations_x0zhn_1`,expandable:`_expandable_x0zhn_13`,annotations:`_annotations_x0zhn_21`,highlighted:`_highlighted_x0zhn_21`},ThreadedAnnotationsContent=({messages:messageList,isResolved=!1,resolvedBy,resolvedAt,maxCharacterCount,onDelete,onThreadDelete,onAvatarClick,onCopyLink,onEdit,onEditError,onResolve,onUnresolve,onPost,onPostError,isRichTextEnabled=!1,onFormatToggle,userSelectorProps,onEditorOpenChange,annotationTarget,onAnnotationBadgeClick,originalContentDeleted,isHighlighted=!1,autoFocusReplyEditor=!0})=>{let{viewState,dispatch,editingMessageId,replyMention,isReplyDisabled,isAnnotations}=useThreadedAnnotationsContext(),containerRef=useRef(null),replyDraftRef=useRef(null),isExpanded=viewState!==ThreadViewState.Collapsed,hasHiddenReplies=messageList.length>2,isExpandable=viewState===ThreadViewState.Collapsed&&(hasHiddenReplies||!isReplyDisabled&&!isResolved);useEffect(()=>{editingMessageId&&!messageList.some(message=>message.id===editingMessageId)&&dispatch({type:`CLEAR_EDIT`})},[editingMessageId,messageList,dispatch]),useEffect(()=>{onEditorOpenChange?.(isExpanded)},[isExpanded,onEditorOpenChange]),useEffect(()=>{if(!isExpanded)return;let portalSelector=`[${Object.keys(THREADED_ANNOTATIONS_PORTAL)[0]}]`,handleClickOutside=e=>{let target=e.target;containerRef.current?.contains(target)||document.querySelector(portalSelector)?.contains(target)||dispatch({type:`COLLAPSE`})};return document.addEventListener(`mousedown`,handleClickOutside),()=>document.removeEventListener(`mousedown`,handleClickOutside)},[isExpanded,dispatch]);let hasNoMessages=messageList.length===0,handleClearMention=useCallback(()=>dispatch({type:`CLEAR_MENTION`}),[dispatch]),handleReplyChange=useCallback(content=>{replyDraftRef.current=content},[]),handlePostSuccess=useCallback(()=>{replyDraftRef.current=null,handleClearMention()},[handleClearMention]),initialReplyContent=useMemo(()=>replyMention?mergeMentionIntoDraft(buildMentionContent(replyMention),replyDraftRef.current):null,[replyMention]),handleClick=useCallback(e=>{if(!isExpandable)return;let target=e.target;!e.currentTarget.contains(target)||target.closest(`[data-no-expand]`)||dispatch({type:`EXPAND`})},[isExpandable,dispatch]);return isAnnotations&&hasNoMessages?jsx(MessageEditor,{isFirstAnnotation:!0,isRichTextEnabled,maxCharacterCount,onFormatToggle,onPost,onPostError,onPostSuccess:handleClearMention,userSelectorProps}):jsxs(`div`,{ref:containerRef,className:clsx(threaded_annotations_module_default.threadedAnnotations,isExpandable&&threaded_annotations_module_default.expandable,isAnnotations&&threaded_annotations_module_default.annotations,isHighlighted&&threaded_annotations_module_default.highlighted),"data-thread-expandable":isExpandable?!0:void 0,"data-thread-highlighted":isHighlighted?!0:void 0,onClick:isExpandable?handleClick:void 0,children:[jsx(MessagesView,{messages:messageList,isResolved,resolvedBy,resolvedAt,maxCharacterCount,onDelete,onThreadDelete,onAvatarClick,onCopyLink,onEdit,onEditError,onResolve,onUnresolve,isRichTextEnabled,onFormatToggle,userSelectorProps,annotationTarget,onAnnotationBadgeClick,originalContentDeleted}),viewState===ThreadViewState.Composing&&jsx(MessageEditor,{autoFocus:autoFocusReplyEditor,initialContent:initialReplyContent,isRichTextEnabled,maxCharacterCount,onChange:handleReplyChange,onFormatToggle,onPost,onPostError,onPostSuccess:handlePostSuccess,isReply:!0,userSelectorProps})]})},ThreadedAnnotations=props=>jsx(ThreadedAnnotationsProvider,{defaultExpanded:props.defaultExpanded||props.messages.length===0,isReplyDisabled:props.isReplyDisabled||props.isResolved,isEditDisabled:props.isEditDisabled||props.isResolved,isAnnotations:props.isAnnotations,collapsed:props.collapsed,children:jsx(ThreadedAnnotationsContent,{...props})});export{ThreadedAnnotations as t};
|
package/dist/esm/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import"./lib/document-node-types.js";import{MentionContextProvider,useMentionContext}from"./lib/components/mention-component/mention-context.js";import{t as ThreadedAnnotations}from"../chunks/threaded-annotations.js";import{MessageEditor}from"./lib/components/v2/message-editor/message-editor.js";import{AnnotationBadgeType}from"./lib/v2/types/annotation-badge-types.js";import{isKnownBlockNode,isListNode}from"./lib/v2/utils/document-node-guards.js";import{t as ThreadedAnnotations$1}from"../chunks/threaded-annotations2.js";import{serializeMentionMarkup}from"./lib/v2/utils/serialize-mention-markup.js";export{AnnotationBadgeType,MentionContextProvider,MessageEditor as MessageEditorV2,ThreadedAnnotations,ThreadedAnnotations$1 as ThreadedAnnotationsV2,isKnownBlockNode,isListNode,serializeMentionMarkup,useMentionContext};
|
|
1
|
+
import"./lib/document-node-types.js";import{MentionContextProvider,useMentionContext}from"./lib/components/mention-component/mention-context.js";import{t as ThreadedAnnotations}from"../chunks/threaded-annotations.js";import{MessageEditor}from"./lib/components/v2/message-editor/message-editor.js";import{AnnotationBadgeType}from"./lib/v2/types/annotation-badge-types.js";import{isKnownBlockNode,isListNode}from"./lib/v2/utils/document-node-guards.js";import{t as ThreadedAnnotations$1}from"../chunks/threaded-annotations2.js";import{serializeMentionMarkup}from"./lib/v2/utils/serialize-mention-markup.js";import{parseMessageMarkdown}from"./lib/v2/utils/parse-message-markdown.js";import{serializeMessageToMarkdown}from"./lib/v2/utils/serialize-message-to-markdown.js";export{AnnotationBadgeType,MentionContextProvider,MessageEditor as MessageEditorV2,ThreadedAnnotations,ThreadedAnnotations$1 as ThreadedAnnotationsV2,isKnownBlockNode,isListNode,parseMessageMarkdown,serializeMentionMarkup,serializeMessageToMarkdown,useMentionContext};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{CustomMention}from"./custom-mention/custom-mention.js";import{CustomParagraph}from"./custom-paragraph.js";import{DismissBarOnEscape}from"./dismiss-bar-on-escape.js";import{NormalizeEmptyNodeSelection}from"./normalize-empty-node-selection.js";import{StripMentionMarks}from"./strip-mention-marks.js";import Document from"@tiptap/extension-document";import Text from"@tiptap/extension-text";import Bold from"@tiptap/extension-bold";import Italic from"@tiptap/extension-italic";import{BulletList,ListItem,OrderedList}from"@tiptap/extension-list";import
|
|
1
|
+
import{CustomMention}from"./custom-mention/custom-mention.js";import{CustomParagraph}from"./custom-paragraph.js";import{CustomUnderline}from"./custom-underline.js";import{DismissBarOnEscape}from"./dismiss-bar-on-escape.js";import{NormalizeEmptyNodeSelection}from"./normalize-empty-node-selection.js";import{StripMentionMarks}from"./strip-mention-marks.js";import Document from"@tiptap/extension-document";import Text from"@tiptap/extension-text";import Bold from"@tiptap/extension-bold";import Italic from"@tiptap/extension-italic";import{BulletList,ListItem,OrderedList}from"@tiptap/extension-list";import{Placeholder,UndoRedo}from"@tiptap/extensions";var createMessageEditorExtensions=({isRichTextEnabled,mentionSuggestion,placeholder})=>{let baseExtensions=[Document,CustomParagraph,Placeholder.configure({placeholder,showOnlyWhenEditable:!1}),Text,CustomMention.configure({suggestion:mentionSuggestion})];return isRichTextEnabled?[...baseExtensions,UndoRedo,Bold,Italic,CustomUnderline,BulletList.configure({keepMarks:!0}),OrderedList.configure({keepMarks:!0}),ListItem,NormalizeEmptyNodeSelection,DismissBarOnEscape,StripMentionMarks]:baseExtensions};export{createMessageEditorExtensions};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{markInputRule,markPasteRule}from"@tiptap/core";import Underline from"@tiptap/extension-underline";var plusPlusInputRegex=/(?:^|\s)(\+\+(?!\s+\+\+)((?:[^+]+))\+\+(?!\s+\+\+))$/,plusPlusPasteRegex=/(?:^|\s)(\+\+(?!\s+\+\+)((?:[^+]+))\+\+(?!\s+\+\+))/g,CustomUnderline=Underline.extend({addInputRules(){return[markInputRule({find:plusPlusInputRegex,type:this.type})]},addPasteRules(){return[markPasteRule({find:plusPlusPasteRegex,type:this.type})]}});export{CustomUnderline};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{THREADED_ANNOTATIONS_PORTAL}from"../../../v2/constants.js";import{useMentionContext}from"../../mention-component/mention-context.js";import{getSubmitShortcutAriaKeyShortcuts,isSubmitShortcut}from"../../../utils/is-submit-shortcut.js";import{createSuggestionOptions}from"./editor-extensions/custom-mention/custom-mention-suggestions.js";import{MENTION_PLUGIN_KEY,normalizeMentionPastedText,normalizeMentionTextInput}from"./editor-extensions/custom-mention/mention-trigger-normalization.js";import{useMentionState}from"./editor-extensions/custom-mention/useMentionState.js";import{createMessageEditorExtensions}from"./editor-extensions/create-message-editor-extensions.js";import{useCharacterLimit}from"./hooks/useCharacterLimit.js";import{useEditorContainerState}from"./hooks/useEditorContainerState.js";import{useMentionUserSelection}from"./hooks/useMentionUserSelection.js";import{MessageEditorProvider,useMessageEditorContext}from"./message-editor-context.js";import messages from"./messages.js";import{t as message_editor_module_default}from"../../../../../chunks/message-editor2.module.js";import{CharacterLimitCounter}from"./subcomponents/character-limit-counter.js";import{EditButtons}from"./subcomponents/edit-buttons.js";import{ErrorMessage}from"./subcomponents/error-message.js";import{t as MessageEditorBubbleMenu}from"../../../../../chunks/message-editor-bubble-menu.js";import{PostButton}from"./subcomponents/post-button.js";import{t as TimestampToggle}from"../../../../../chunks/timestamp-toggle.js";import{MessageEditorVariant}from"./message-editor.types.js";import{VisuallyHidden}from"@box/blueprint-web";import clsx from"clsx";import{useCallback,useEffect,useMemo,useRef}from"react";import{useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{EditorContent,useEditor,useEditorState}from"@tiptap/react";import{UserSelectorHeadless}from"@box/user-selector";var IS_APPLE_DEVICE=typeof navigator<`u`&&/Mac|iP(hone|ad|od)/.test(navigator.platform),getShortcutFormat=event=>{if(!(IS_APPLE_DEVICE?event.metaKey:event.ctrlKey))return null;if(event.shiftKey)return event.code===`Digit8`?`bulletList`:event.code===`Digit7`?`orderedList`:null;switch(event.key.toLowerCase()){case`b`:return`bold`;case`i`:return`italic`;case`u`:return`underline`;default:return null}},MessageEditorContent=props=>{let{autoFocus=!0,disableComponent=!1,initialContent,isFirstAnnotation=!1,isReply=!1,isRichTextEnabled=!1,maxCharacterCount,onFormatToggle,userSelectorProps,videoTimestamp}=props,userSelectorRef=useRef(null),editorContainerRef=useRef(null),editorViewportRef=useRef(null),editorRef=useRef(null),editorInstanceRef=useRef(null),postButtonRef=useRef(null),onFormatToggleRef=useRef(onFormatToggle);onFormatToggleRef.current=onFormatToggle;let intl=useIntl(),{errorMessage,isLoading}=useMessageEditorContext(),{close:closeMentionDropdown,isActive,query,command,suggestionCallbacks}=useMentionState(userSelectorRef),{closeAllPopovers}=useMentionContext(),placeholderText=intl.formatMessage(isReply?messages.placeholderReply:messages.placeholderAddComment),isEditVariant=props.variant===MessageEditorVariant.EDIT_MESSAGE,editor=useEditor({extensions:createMessageEditorExtensions({isRichTextEnabled,mentionSuggestion:createSuggestionOptions(MENTION_PLUGIN_KEY,`@`,suggestionCallbacks),placeholder:placeholderText}),autofocus:autoFocus,content:initialContent,editorProps:{attributes:{"aria-keyshortcuts":getSubmitShortcutAriaKeyShortcuts(),class:message_editor_module_default.editor},handleKeyDown:(view,event)=>{if(!isEditVariant&&isSubmitShortcut(event)){let postButton=postButtonRef.current;return!postButton||postButton.disabled?!1:(postButton.click(),!0)}if(isRichTextEnabled){let format=getShortcutFormat(event),editorInstance=editorInstanceRef.current;if(format&&editorInstance?.isEditable){let wasActive=editorInstance.isActive(format);queueMicrotask(()=>{if(editorInstance.isDestroyed)return;let isFormatActive=editorInstance.isActive(format);isFormatActive!==wasActive&&onFormatToggleRef.current?.(format,isFormatActive)})}}return!1},handleTextInput:normalizeMentionTextInput,transformPastedText:normalizeMentionPastedText},onCreate:({editor:editorInstance})=>{editorInstanceRef.current=editorInstance,editorRef.current=editorInstance.view.dom,autoFocus&&editorInstance.commands.focus(`end`)},onUpdate:()=>{closeAllPopovers?.()}},[placeholderText,isRichTextEnabled,isEditVariant]),{onUserSelected}=useMentionUserSelection(useMemo(()=>command&&editor&&!editor.isDestroyed?{command,editor}:null,[command,editor])),{exceedsSingleLine,hasScroll,isAtBottom}=useEditorContainerState(editorContainerRef,editor),characterLimitState=useCharacterLimit(editor,maxCharacterCount),isEditorEmpty=useEditorState({editor,selector:()=>({isEmpty:!editor||!editor.schema||editor.isEmpty})})?.isEmpty??!0,shouldApplyEditorFullWidth=isEditVariant||!isFirstAnnotation||isFirstAnnotation&&exceedsSingleLine,disableEditor=disableComponent||isLoading,isCharacterLimitExceeded=(characterLimitState?.excess??0)>0,isPostDisabled=isEditorEmpty||disableEditor||isCharacterLimitExceeded,showCharacterLimitCounter=characterLimitState&&characterLimitState.excess>0&&shouldApplyEditorFullWidth;useEffect(()=>{editor&&editor.setEditable(!disableEditor)},[editor,disableEditor]),useEffect(()=>{if(!isCharacterLimitExceeded||!editorContainerRef.current||!initialContent)return;let innerFrameId=0,outerFrameId=requestAnimationFrame(()=>{innerFrameId=requestAnimationFrame(()=>{editorContainerRef.current?.scrollTo({top:editorContainerRef.current.scrollHeight})})});return()=>{cancelAnimationFrame(outerFrameId),cancelAnimationFrame(innerFrameId)}},[isCharacterLimitExceeded]),useEffect(()=>{!editor||initialContent===void 0||queueMicrotask(()=>{editor.isDestroyed||(editor.chain().setMeta(`addToHistory`,!1).setContent(initialContent??``,{emitUpdate:!1}).run(),autoFocus&&editor.commands.focus(`end`))})},[initialContent]),useEffect(()=>{if(!isActive)return;let portalSelector=`[${Object.keys(THREADED_ANNOTATIONS_PORTAL)[0]}]`,isInsideEditorOrPortal=target=>{if(editorContainerRef.current?.contains(target))return!0;let portals=document.querySelectorAll(portalSelector);for(let portal of portals)if(portal.contains(target))return!0;return!1},handleClose=e=>{let target=e.target;!target||isInsideEditorOrPortal(target)||closeMentionDropdown()},frameId=requestAnimationFrame(()=>{document.addEventListener(`mousedown`,handleClose),document.addEventListener(`focusin`,handleClose)});return()=>{cancelAnimationFrame(frameId),document.removeEventListener(`mousedown`,handleClose),document.removeEventListener(`focusin`,handleClose)}},[closeMentionDropdown,isActive]);let handleFormatToggle=useCallback((format,isFormatActive)=>onFormatToggleRef.current?.(format,isFormatActive),[]),anchorElement=jsx(`div`,{className:message_editor_module_default.anchorElement});return jsx(`div`,{"data-no-expand":!0,className:message_editor_module_default.messageEditorWrapper,children:jsxs(`div`,{className:clsx(message_editor_module_default.messageEditor,{[message_editor_module_default.editorHasScroll]:hasScroll,[message_editor_module_default.editorEditMode]:isEditVariant,[message_editor_module_default.editorError]:errorMessage||isCharacterLimitExceeded,[message_editor_module_default.editorFirstAnnotation]:!isEditVariant&&isFirstAnnotation,[message_editor_module_default.editorCharacterLimitExceeded]:isCharacterLimitExceeded}),children:[jsxs(`div`,{ref:editorViewportRef,className:clsx(message_editor_module_default.editorViewport,{[message_editor_module_default.editorFullWidth]:shouldApplyEditorFullWidth}),children:[isRichTextEnabled&&jsx(MessageEditorBubbleMenu,{editor,menuAnchorRef:editorViewportRef,onFormatToggle:handleFormatToggle}),jsxs(`div`,{ref:editorContainerRef,className:message_editor_module_default.editorContainer,"aria-label":intl.formatMessage(messages.scrollContainerAriaLabel),children:[jsx(EditorContent,{"aria-label":intl.formatMessage(messages.editorContentAriaLabel),editor}),jsx(UserSelectorHeadless,{ref:userSelectorRef,inputElementRef:editorRef,onSelectedUserChange:onUserSelected,open:isActive,rootElement:anchorElement,value:query,...userSelectorProps,popoverContentContainerProps:{...userSelectorProps.popoverContentContainerProps,...THREADED_ANNOTATIONS_PORTAL,avoidCollisions:!0}})]}),hasScroll&&jsx(`div`,{className:clsx(message_editor_module_default.editorFade,{[message_editor_module_default.editorFadeHidden]:isAtBottom}),"aria-hidden":`true`})]}),jsx(`div`,{className:clsx(message_editor_module_default.actionsWrapper,{[message_editor_module_default.withTimestampToggle]:!!videoTimestamp}),children:jsxs(`div`,{className:clsx(message_editor_module_default.actionsWrapperInner,{[message_editor_module_default.scrolledToBottom]:isAtBottom,[message_editor_module_default.characterLimitExceeded]:isCharacterLimitExceeded}),children:[errorMessage&&jsx(ErrorMessage,{errorMessage}),characterLimitState&&characterLimitState.excess>0&&!shouldApplyEditorFullWidth&&jsx(VisuallyHidden,{role:`alert`,children:intl.formatMessage(messages.characterLimitExceeded,{excess:characterLimitState.excess})}),videoTimestamp&&jsx(TimestampToggle,{className:message_editor_module_default.timestampToggle,disabled:disableEditor,formattedTimestamp:videoTimestamp.formattedTimestamp,isPressed:videoTimestamp.isPressed,onChange:videoTimestamp.onPressedChange}),isEditVariant?jsxs(`div`,{className:message_editor_module_default.editActionsColumn,children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(`div`,{className:message_editor_module_default.editActionsRow,children:jsx(EditButtons,{disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onCancel:props.onEditCancel,onEditSuccess:props.onEditSuccess,onSave:props.onSave,onSaveError:props.onSaveError})})]}):jsxs(Fragment,{children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(PostButton,{buttonRef:postButtonRef,cleanEditor:()=>editor?.chain().setMeta(`addToHistory`,!1).setContent(``,{emitUpdate:!1}).run(),disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onPost:props.onPost,onPostError:props.onPostError,onPostSuccess:props.onPostSuccess})]})]})})]})})},MessageEditor=props=>jsx(MessageEditorProvider,{children:jsx(MessageEditorContent,{...props})});export{MessageEditor,MessageEditorVariant};
|
|
1
|
+
import{THREADED_ANNOTATIONS_PORTAL}from"../../../v2/constants.js";import{useMentionContext}from"../../mention-component/mention-context.js";import{getSubmitShortcutAriaKeyShortcuts,isSubmitShortcut}from"../../../utils/is-submit-shortcut.js";import{createSuggestionOptions}from"./editor-extensions/custom-mention/custom-mention-suggestions.js";import{MENTION_PLUGIN_KEY,normalizeMentionPastedText,normalizeMentionTextInput}from"./editor-extensions/custom-mention/mention-trigger-normalization.js";import{useMentionState}from"./editor-extensions/custom-mention/useMentionState.js";import{createMessageEditorExtensions}from"./editor-extensions/create-message-editor-extensions.js";import{useCharacterLimit}from"./hooks/useCharacterLimit.js";import{useEditorContainerState}from"./hooks/useEditorContainerState.js";import{useMentionUserSelection}from"./hooks/useMentionUserSelection.js";import{MessageEditorProvider,useMessageEditorContext}from"./message-editor-context.js";import messages from"./messages.js";import{t as message_editor_module_default}from"../../../../../chunks/message-editor2.module.js";import{CharacterLimitCounter}from"./subcomponents/character-limit-counter.js";import{EditButtons}from"./subcomponents/edit-buttons.js";import{ErrorMessage}from"./subcomponents/error-message.js";import{t as MessageEditorBubbleMenu}from"../../../../../chunks/message-editor-bubble-menu.js";import{PostButton}from"./subcomponents/post-button.js";import{t as TimestampToggle}from"../../../../../chunks/timestamp-toggle.js";import{MessageEditorVariant}from"./message-editor.types.js";import{VisuallyHidden}from"@box/blueprint-web";import clsx from"clsx";import{useCallback,useEffect,useMemo,useRef}from"react";import{useIntl}from"react-intl";import{Fragment,jsx,jsxs}from"react/jsx-runtime";import{EditorContent,useEditor,useEditorState}from"@tiptap/react";import{UserSelectorHeadless}from"@box/user-selector";var IS_APPLE_DEVICE=typeof navigator<`u`&&/Mac|iP(hone|ad|od)/.test(navigator.platform),getShortcutFormat=event=>{if(!(IS_APPLE_DEVICE?event.metaKey:event.ctrlKey))return null;if(event.shiftKey)return event.code===`Digit8`?`bulletList`:event.code===`Digit7`?`orderedList`:null;switch(event.key.toLowerCase()){case`b`:return`bold`;case`i`:return`italic`;case`u`:return`underline`;default:return null}},MessageEditorContent=props=>{let{autoFocus=!0,disableComponent=!1,initialContent,isFirstAnnotation=!1,isReply=!1,isRichTextEnabled=!1,maxCharacterCount,onChange,onFormatToggle,userSelectorProps,videoTimestamp}=props,userSelectorRef=useRef(null),editorContainerRef=useRef(null),editorViewportRef=useRef(null),editorRef=useRef(null),editorInstanceRef=useRef(null),postButtonRef=useRef(null),onFormatToggleRef=useRef(onFormatToggle);onFormatToggleRef.current=onFormatToggle;let onChangeRef=useRef(onChange);onChangeRef.current=onChange;let intl=useIntl(),{errorMessage,isLoading}=useMessageEditorContext(),{close:closeMentionDropdown,isActive,query,command,suggestionCallbacks}=useMentionState(userSelectorRef),{closeAllPopovers}=useMentionContext(),placeholderText=intl.formatMessage(isReply?messages.placeholderReply:messages.placeholderAddComment),isEditVariant=props.variant===MessageEditorVariant.EDIT_MESSAGE,editor=useEditor({extensions:createMessageEditorExtensions({isRichTextEnabled,mentionSuggestion:createSuggestionOptions(MENTION_PLUGIN_KEY,`@`,suggestionCallbacks),placeholder:placeholderText}),autofocus:autoFocus,content:initialContent,editorProps:{attributes:{"aria-keyshortcuts":getSubmitShortcutAriaKeyShortcuts(),class:message_editor_module_default.editor},handleKeyDown:(view,event)=>{if(!isEditVariant&&isSubmitShortcut(event)){let postButton=postButtonRef.current;return!postButton||postButton.disabled?!1:(postButton.click(),!0)}if(isRichTextEnabled){let format=getShortcutFormat(event),editorInstance=editorInstanceRef.current;if(format&&editorInstance?.isEditable){let wasActive=editorInstance.isActive(format);queueMicrotask(()=>{if(editorInstance.isDestroyed)return;let isFormatActive=editorInstance.isActive(format);isFormatActive!==wasActive&&onFormatToggleRef.current?.(format,isFormatActive)})}}return!1},handleTextInput:normalizeMentionTextInput,transformPastedText:normalizeMentionPastedText},onCreate:({editor:editorInstance})=>{editorInstanceRef.current=editorInstance,editorRef.current=editorInstance.view.dom,autoFocus&&editorInstance.commands.focus(`end`)},onUpdate:({editor:editorInstance})=>{onChangeRef.current?.(editorInstance.isEmpty?null:editorInstance.getJSON()),closeAllPopovers?.()}},[placeholderText,isRichTextEnabled,isEditVariant]),{onUserSelected}=useMentionUserSelection(useMemo(()=>command&&editor&&!editor.isDestroyed?{command,editor}:null,[command,editor])),{exceedsSingleLine,hasScroll,isAtBottom}=useEditorContainerState(editorContainerRef,editor),characterLimitState=useCharacterLimit(editor,maxCharacterCount),isEditorEmpty=useEditorState({editor,selector:()=>({isEmpty:!editor||!editor.schema||editor.isEmpty})})?.isEmpty??!0,shouldApplyEditorFullWidth=isEditVariant||!isFirstAnnotation||isFirstAnnotation&&exceedsSingleLine,disableEditor=disableComponent||isLoading,isCharacterLimitExceeded=(characterLimitState?.excess??0)>0,isPostDisabled=isEditorEmpty||disableEditor||isCharacterLimitExceeded,showCharacterLimitCounter=characterLimitState&&characterLimitState.excess>0&&shouldApplyEditorFullWidth;useEffect(()=>{editor&&editor.setEditable(!disableEditor)},[editor,disableEditor]),useEffect(()=>{if(!isCharacterLimitExceeded||!editorContainerRef.current||!initialContent)return;let innerFrameId=0,outerFrameId=requestAnimationFrame(()=>{innerFrameId=requestAnimationFrame(()=>{editorContainerRef.current?.scrollTo({top:editorContainerRef.current.scrollHeight})})});return()=>{cancelAnimationFrame(outerFrameId),cancelAnimationFrame(innerFrameId)}},[isCharacterLimitExceeded]),useEffect(()=>{!editor||initialContent===void 0||queueMicrotask(()=>{editor.isDestroyed||(editor.chain().setMeta(`addToHistory`,!1).setContent(initialContent??``,{emitUpdate:!1}).run(),onChangeRef.current?.(editor.isEmpty?null:editor.getJSON()),autoFocus&&editor.commands.focus(`end`))})},[initialContent]),useEffect(()=>{if(!isActive)return;let portalSelector=`[${Object.keys(THREADED_ANNOTATIONS_PORTAL)[0]}]`,isInsideEditorOrPortal=target=>{if(editorContainerRef.current?.contains(target))return!0;let portals=document.querySelectorAll(portalSelector);for(let portal of portals)if(portal.contains(target))return!0;return!1},handleClose=e=>{let target=e.target;!target||isInsideEditorOrPortal(target)||closeMentionDropdown()},frameId=requestAnimationFrame(()=>{document.addEventListener(`mousedown`,handleClose),document.addEventListener(`focusin`,handleClose)});return()=>{cancelAnimationFrame(frameId),document.removeEventListener(`mousedown`,handleClose),document.removeEventListener(`focusin`,handleClose)}},[closeMentionDropdown,isActive]);let handleFormatToggle=useCallback((format,isFormatActive)=>onFormatToggleRef.current?.(format,isFormatActive),[]),anchorElement=jsx(`div`,{className:message_editor_module_default.anchorElement});return jsx(`div`,{"data-no-expand":!0,className:message_editor_module_default.messageEditorWrapper,children:jsxs(`div`,{className:clsx(message_editor_module_default.messageEditor,{[message_editor_module_default.editorHasScroll]:hasScroll,[message_editor_module_default.editorEditMode]:isEditVariant,[message_editor_module_default.editorError]:errorMessage||isCharacterLimitExceeded,[message_editor_module_default.editorFirstAnnotation]:!isEditVariant&&isFirstAnnotation,[message_editor_module_default.editorCharacterLimitExceeded]:isCharacterLimitExceeded}),children:[jsxs(`div`,{ref:editorViewportRef,className:clsx(message_editor_module_default.editorViewport,{[message_editor_module_default.editorFullWidth]:shouldApplyEditorFullWidth}),children:[isRichTextEnabled&&jsx(MessageEditorBubbleMenu,{editor,menuAnchorRef:editorViewportRef,onFormatToggle:handleFormatToggle}),jsxs(`div`,{ref:editorContainerRef,className:message_editor_module_default.editorContainer,"aria-label":intl.formatMessage(messages.scrollContainerAriaLabel),children:[jsx(EditorContent,{"aria-label":intl.formatMessage(messages.editorContentAriaLabel),editor}),jsx(UserSelectorHeadless,{ref:userSelectorRef,inputElementRef:editorRef,onSelectedUserChange:onUserSelected,open:isActive,rootElement:anchorElement,value:query,...userSelectorProps,popoverContentContainerProps:{...userSelectorProps.popoverContentContainerProps,...THREADED_ANNOTATIONS_PORTAL,avoidCollisions:!0}})]}),hasScroll&&jsx(`div`,{className:clsx(message_editor_module_default.editorFade,{[message_editor_module_default.editorFadeHidden]:isAtBottom}),"aria-hidden":`true`})]}),jsx(`div`,{className:clsx(message_editor_module_default.actionsWrapper,{[message_editor_module_default.withTimestampToggle]:!!videoTimestamp}),children:jsxs(`div`,{className:clsx(message_editor_module_default.actionsWrapperInner,{[message_editor_module_default.scrolledToBottom]:isAtBottom,[message_editor_module_default.characterLimitExceeded]:isCharacterLimitExceeded}),children:[errorMessage&&jsx(ErrorMessage,{errorMessage}),characterLimitState&&characterLimitState.excess>0&&!shouldApplyEditorFullWidth&&jsx(VisuallyHidden,{role:`alert`,children:intl.formatMessage(messages.characterLimitExceeded,{excess:characterLimitState.excess})}),videoTimestamp&&jsx(TimestampToggle,{className:message_editor_module_default.timestampToggle,disabled:disableEditor,formattedTimestamp:videoTimestamp.formattedTimestamp,isPressed:videoTimestamp.isPressed,onChange:videoTimestamp.onPressedChange}),isEditVariant?jsxs(`div`,{className:message_editor_module_default.editActionsColumn,children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(`div`,{className:message_editor_module_default.editActionsRow,children:jsx(EditButtons,{disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onCancel:props.onEditCancel,onEditSuccess:props.onEditSuccess,onSave:props.onSave,onSaveError:props.onSaveError})})]}):jsxs(Fragment,{children:[showCharacterLimitCounter&&jsx(CharacterLimitCounter,{count:characterLimitState.count,excess:characterLimitState.excess,maxCount:characterLimitState.maxCount}),jsx(PostButton,{buttonRef:postButtonRef,cleanEditor:()=>editor?.chain().setMeta(`addToHistory`,!1).setContent(``,{emitUpdate:!1}).run(),disabled:isPostDisabled,getEditorJsonContent:()=>editor?.getJSON(),onPost:props.onPost,onPostError:props.onPostError,onPostSuccess:props.onPostSuccess})]})]})})]})})},MessageEditor=props=>jsx(MessageEditorProvider,{children:jsx(MessageEditorContent,{...props})});export{MessageEditor,MessageEditorVariant};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var mergeMentionIntoDraft=(mentionDoc,draft)=>{if(!mentionDoc)return draft;if(!draft)return mentionDoc;let mentionNodes=mentionDoc.content?.[0]?.content??[],draftBlocks=draft.content??[],firstDraftBlock=draftBlocks[0],draftNodes=firstDraftBlock?.content??[],mentionUserId=mentionNodes[0]?.attrs?.mentionedUserId,leadingDraftMentionUserId=draftNodes[0]?.type===`mention`?draftNodes[0].attrs?.mentionedUserId:void 0;return mentionUserId&&mentionUserId===leadingDraftMentionUserId?draft:{type:`doc`,content:[{type:`paragraph`,attrs:firstDraftBlock?.attrs,content:[...mentionNodes,...draftNodes]},...draftBlocks.slice(1)]}};export{mergeMentionIntoDraft};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{underlineMarkdownItPlugin}from"./underline-markdown-it-plugin.js";import{v4}from"uuid";import MarkdownIt from"markdown-it";var MARKDOWN_IT_DISABLE=[`autolink`,`backticks`,`blockquote`,`code`,`fence`,`heading`,`hr`,`html_block`,`html_inline`,`image`,`lheading`,`link`,`reference`],UAA_MENTION_RE=/^@\[([^:\]]+):([^\]]+)\]/,tokenizeUaaMention=(state,silent)=>{if(state.src.charCodeAt(state.pos)!==64)return!1;let match=UAA_MENTION_RE.exec(state.src.slice(state.pos));if(!match)return!1;if(!silent){let token=state.push(`mention`,`mention`,0);token.content=match[0],token.meta={userId:match[1],userName:match[2]}}return state.pos+=match[0].length,!0},tokenizer=(()=>{let tokenizer=new MarkdownIt(`commonmark`,{html:!1,linkify:!1,breaks:!1});return MARKDOWN_IT_DISABLE.forEach(rule=>{tokenizer.disable(rule)}),tokenizer.inline.ruler.before(`escape`,`uaa_mention`,tokenizeUaaMention),tokenizer.use(underlineMarkdownItPlugin),tokenizer})(),createEmptyDoc=()=>({type:`doc`,content:[]}),createMention=(userId,userName)=>({attrs:{authorId:userId,mentionId:v4(),mentionedUserId:userId,mentionedUserName:userName},type:`mention`}),marksFromStack=stack=>stack.length>0?stack.map(type=>({type})):void 0,OPEN_MARK={em_open:`italic`,strong_open:`bold`,underline_open:`underline`},CLOSE_MARK={em_close:`italic`,strong_close:`bold`,underline_close:`underline`},parseInline=tokens=>{if(!tokens?.length)return;let content=[],markStack=[],pushText=text=>{text&&content.push({type:`text`,text,marks:marksFromStack(markStack)})};return tokens.forEach(token=>{if(token.type===`mention`){let meta=token.meta;meta&&content.push(createMention(meta.userId,meta.userName));return}if(token.type===`text`){pushText(token.content);return}if(token.type===`softbreak`||token.type===`hardbreak`){pushText(`
|
|
2
|
+
`);return}let openMark=OPEN_MARK[token.type];if(openMark){markStack.push(openMark);return}let closeMark=CLOSE_MARK[token.type];if(closeMark){let index=markStack.lastIndexOf(closeMark);index>=0&&markStack.splice(index,1)}}),content.length>0?content:void 0},parseListItem=(tokens,openIndex)=>{let content=[],index=openIndex+1;for(;index<tokens.length&&tokens[index].type!==`list_item_close`;){let token=tokens[index];if(token.type===`paragraph_open`){let{paragraph,closeIndex}=parseParagraph(tokens,index);content.push(paragraph),index=closeIndex+1}else if(token.type===`bullet_list_open`||token.type===`ordered_list_open`){let{list,closeIndex}=parseList(tokens,index);content.push(list),index=closeIndex+1}else index+=1}return{closeIndex:index,item:{type:`listItem`,content:content.length>0?content:void 0}}},parseList=(tokens,openIndex)=>{let open=tokens[openIndex],isOrdered=open.type===`ordered_list_open`,closeType=isOrdered?`ordered_list_close`:`bullet_list_close`,items=[],index=openIndex+1;for(;index<tokens.length&&tokens[index].type!==closeType;)if(tokens[index].type===`list_item_open`){let parsed=parseListItem(tokens,index);items.push(parsed.item),index=parsed.closeIndex+1}else index+=1;if(!isOrdered)return{closeIndex:index,list:{type:`bulletList`,content:items}};let startRaw=open.attrGet(`start`),start=startRaw==null?void 0:Number(startRaw);return{closeIndex:index,list:Number.isFinite(start)&&start!==1?{type:`orderedList`,content:items,attrs:{start}}:{type:`orderedList`,content:items}}},parseParagraph=(tokens,openIndex)=>{let index=openIndex+1,inline;for(;index<tokens.length&&tokens[index].type!==`paragraph_close`;)tokens[index].type===`inline`&&(inline=tokens[index]),index+=1;return{closeIndex:index,paragraph:{type:`paragraph`,content:parseInline(inline?.children)}}},parseBlocks=tokens=>{let blocks=[],index=0;for(;index<tokens.length;){let token=tokens[index];if(token.type===`paragraph_open`){let{paragraph,closeIndex}=parseParagraph(tokens,index);blocks.push(paragraph),index=closeIndex+1}else if(token.type===`bullet_list_open`||token.type===`ordered_list_open`){let{list,closeIndex}=parseList(tokens,index);blocks.push(list),index=closeIndex+1}else index+=1}return blocks},parseMessageMarkdown=markdown=>markdown?{type:`doc`,content:parseBlocks(tokenizer.parse(markdown,{}))}:createEmptyDoc();export{parseMessageMarkdown};
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{isListNode}from"./document-node-guards.js";var MARK_WRAP_ORDER=[`italic`,`bold`,`underline`],MARK_WRAPPER={bold:text=>`**${text}**`,italic:text=>`_${text}_`,underline:text=>`++${text}++`},ESCAPE_RE=/([\\*_[\]+\-@])/g,escapeText=text=>text.replace(ESCAPE_RE,`\\$1`),escapeOrderedListMarker=text=>text.replace(/(^|\n)(\d{1,9})([.)])(\s)/g,`$1$2\\$3$4`),wrapMarks=(text,marks)=>{let types=new Set((marks??[]).map(mark=>mark.type));if(types.size===0)return text;let[,leadingWhitespace,content,trailingWhitespace]=text.match(/^(\s*)([\s\S]*?)(\s*)$/)??[``,``,text,``];if(!content)return text;let wrapped=content;return MARK_WRAP_ORDER.forEach(type=>{types.has(type)&&(wrapped=MARK_WRAPPER[type](wrapped))}),`${leadingWhitespace}${wrapped}${trailingWhitespace}`},serializeMention=node=>`@[${node.attrs.mentionedUserId}:${node.attrs.mentionedUserName}]`,serializeText=node=>wrapMarks(escapeText(node.text),node.marks),serializeInline=nodes=>(nodes??[]).map(node=>node.type===`mention`?serializeMention(node):serializeText(node)).join(``),serializeParagraph=paragraph=>escapeOrderedListMarker(serializeInline(paragraph.content)),serializeListItem=(item,indent,marker)=>{let content=item.content??[],lines=[],usedMarker=!1,continuationIndent=`${indent}${` `.repeat(marker.length)}`;return content.forEach(child=>{if(child.type===`paragraph`){let inline=serializeParagraph(child);usedMarker?(lines.push(``),lines.push(`${continuationIndent}${inline}`)):(lines.push(`${indent}${marker}${inline}`),usedMarker=!0);return}isListNode(child)&&(usedMarker||=(lines.push(`${indent}${marker}`.trimEnd()),!0),lines.push(...serializeList(child,continuationIndent)))}),usedMarker||lines.push(`${indent}${marker}`.trimEnd()),lines},serializeList=(list,indent)=>{if(list.type===`bulletList`)return(list.content??[]).flatMap(item=>serializeListItem(item,indent,`- `));let start=typeof list.attrs?.start==`number`?list.attrs.start:1;return(list.content??[]).flatMap((item,index)=>serializeListItem(item,indent,`${start+index}. `))},serializeBlock=block=>block.type===`paragraph`?serializeParagraph(block):isListNode(block)?serializeList(block,``).join(`
|
|
2
|
+
`):``,serializeMessageToMarkdown=doc=>doc?.content?.length?doc.content.map(serializeBlock).filter(block=>block.length>0).join(`
|
|
3
|
+
|
|
4
|
+
`):``;export{serializeMessageToMarkdown};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var PLUS_CHAR_CODE=43,tokenize=(state,silent)=>{if(silent)return!1;let start=state.pos;if(state.src.charCodeAt(start)!==PLUS_CHAR_CODE)return!1;let scanned=state.scanDelims(start,!0),len=scanned.length;if(len<2)return!1;let ch=String.fromCharCode(PLUS_CHAR_CODE);if(len%2){let token=state.push(`text`,``,0);token.content=ch,--len}for(let i=0;i<len;i+=2){let token=state.push(`text`,``,0);token.content=`++`,(scanned.can_open||scanned.can_close)&&state.delimiters.push({close:scanned.can_close,end:-1,length:0,marker:PLUS_CHAR_CODE,open:scanned.can_open,token:state.tokens.length-1})}return state.pos+=scanned.length,!0},postProcess=(state,delimiters)=>{delimiters.forEach(startDelim=>{if(startDelim.marker!==PLUS_CHAR_CODE||startDelim.end===-1)return;let endDelim=delimiters[startDelim.end],tokenOpen=state.tokens[startDelim.token];tokenOpen.type=`underline_open`,tokenOpen.tag=`underline`,tokenOpen.nesting=1,tokenOpen.markup=`++`,tokenOpen.content=``;let tokenClose=state.tokens[endDelim.token];tokenClose.type=`underline_close`,tokenClose.tag=`underline`,tokenClose.nesting=-1,tokenClose.markup=`++`,tokenClose.content=``})},underlineMarkdownItPlugin=md=>{md.inline.ruler.before(`emphasis`,`underline`,tokenize),md.inline.ruler2.after(`emphasis`,`underline`,state=>(postProcess(state,state.delimiters),state.tokens_meta.forEach(meta=>{meta?.delimiters&&postProcess(state,meta.delimiters)}),!0))};export{underlineMarkdownItPlugin};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
._messageEditorWrapper_oercc_29{cursor:auto;width:100%}._editActionsColumn_oercc_34{align-items:flex-end;gap:var(--bp-space-010);flex-direction:column;display:flex}._editActionsRow_oercc_41{align-items:center;gap:var(--bp-space-020);display:flex}._characterLimitCounter_oercc_47{white-space:nowrap}._messageEditor_oercc_29{--gradient-fade-height:var(--bp-size-040);box-sizing:border-box;padding:.625rem var(--bp-space-005) .625rem var(--bp-space-040);background-color:var(--surface-surface);outline:var(--bp-border-01) solid var(--border-divider-border);border-radius:var(--bp-radius-10);gap:var(--bp-space-020) var(--bp-space-010);cursor:auto;flex-wrap:wrap;width:100%;display:flex;position:relative}._messageEditor_oercc_29._editorEditMode_oercc_65{--gradient-fade-height:var(--bp-size-050)}._messageEditor_oercc_29:focus-within{outline-width:var(--bp-border-02);outline-color:var(--border-input-border-focus)}._messageEditor_oercc_29._editorFirstAnnotation_oercc_72:not(._editorError_oercc_72):focus-within{outline-width:var(--bp-border-01);outline-color:var(--border-divider-border)}._messageEditor_oercc_29._editorError_oercc_72{outline-color:var(--bp-border-message-border-error);outline-width:var(--bp-border-02)}._messageEditor_oercc_29 ._editorViewport_oercc_80{width:fit-content;min-width:calc(100% - 2.875rem);margin:auto 0;position:relative}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86{box-sizing:border-box;scrollbar-width:thin;scrollbar-color:var(--black-opacity-50) transparent;position:relative;overflow-y:scroll}@supports not (scrollbar-color:gray transparent){._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86{scrollbar-width:initial}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86::-webkit-scrollbar{width:var(--size-2);background-color:#0000}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86::-webkit-scrollbar-thumb{background:var(--black-opacity-50);border-radius:var(--radius-2)}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86::-webkit-scrollbar-thumb:hover{background:var(--black-opacity-50)}}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86{max-height:10rem;padding:.375rem .625rem .375rem 0}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65{outline:none;width:100%}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 strong{font-weight:var(--bp-font-weight-bold);font-style:inherit}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 em{font-style:italic;font-weight:inherit}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ul,._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ol{margin:0;padding-inline-start:var(--bp-space-060)}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ul,._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ul>li{list-style-type:disc}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ol,._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ol>li{list-style-type:decimal}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ul ul,._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ul ol,._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ol ul,._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 ol ol{margin-block-start:var(--bp-space-005)}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 li p{margin:0}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 [data-placeholder]:first-child:before{font-weight:var(--bp-font-weight-regular);font-size:var(--bp-font-size-05);font-family:var(--bp-font-font-family), -apple-system, BlinkMacSystemFont, "San Francisco", "Segoe UI", Roboto, "Helvetica Neue", sans-serif;font-style:normal;line-height:var(--bp-font-line-height-04);letter-spacing:var(--bp-font-letter-spacing-01)}:where(body.is-inter-font) ._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 [data-placeholder]:first-child:before{letter-spacing:.00625rem;text-transform:none;font-family:Inter Variable,-apple-system,BlinkMacSystemFont,San Francisco,Segoe UI,Roboto,Helvetica Neue,sans-serif;font-size:.875rem;font-style:normal;font-weight:450;line-height:1.375rem;text-decoration:none}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorContainer_oercc_86 ._editor_oercc_65 [data-placeholder]:first-child:before{color:var(--text-text-on-light-tertiary);content:attr(data-placeholder);float:left;pointer-events:none;height:0}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorFade_oercc_176{height:var(--bp-size-060);background:linear-gradient(to bottom, transparent, var(--bp-canvas-background,var(--surface-surface)));pointer-events:none;opacity:1;transition:opacity .15s ease-out;position:absolute;bottom:0;left:0;right:0}._messageEditor_oercc_29 ._editorViewport_oercc_80 ._editorFade_oercc_176._editorFadeHidden_oercc_187{opacity:0}._messageEditor_oercc_29 ._editorFullWidth_oercc_190{width:100%;min-width:100%}._messageEditor_oercc_29 ._actionsWrapper_oercc_194{min-height:var(--bp-size-080);width:fit-content;padding-right:var(--bp-space-020);flex:1;justify-content:flex-end;align-items:center;display:flex;position:relative}._messageEditor_oercc_29 ._actionsWrapper_oercc_194 ._actionsWrapperInner_oercc_204{align-items:center;gap:var(--bp-space-020);width:fit-content;display:flex;position:relative}._messageEditor_oercc_29 ._timestampToggle_oercc_211{margin-right:auto}._messageEditor_oercc_29 ._errorMessage_oercc_214{gap:var(--bp-space-010);align-items:center;min-width:0;display:flex}._messageEditor_oercc_29 ._errorMessage_oercc_214>:first-child{flex-shrink:0}._messageEditor_oercc_29 ._errorMessage_oercc_214 ._errorText_oercc_223{color:var(--bp-text-text-destructive-on-light);-webkit-line-clamp:1;-webkit-box-orient:vertical;min-width:0;display:-webkit-box;overflow:hidden}._editorHasScroll_oercc_232{gap:unset;padding-bottom:0}._editorHasScroll_oercc_232 ._editorViewport_oercc_80 ._editorContainer_oercc_86{padding-bottom:var(--bp-space-040);scroll-padding-bottom:var(--bp-space-040)}._editorHasScroll_oercc_232 ._editorViewport_oercc_80 ._editorFade_oercc_176{display:none}._editorHasScroll_oercc_232._editorCharacterLimitExceeded_oercc_243 ._editorViewport_oercc_80 ._editorContainer_oercc_86{padding-bottom:calc(var(--gradient-fade-height,var(--bp-size-040)) + var(--bp-space-040));scroll-padding-bottom:calc(var(--gradient-fade-height,var(--bp-size-040)) + var(--bp-space-040))}._editorHasScroll_oercc_232 ._actionsWrapper_oercc_194{min-width:100%;height:1.875rem;padding-right:0}._editorHasScroll_oercc_232 ._actionsWrapper_oercc_194 ._actionsWrapperInner_oercc_204{bottom:.625rem;left:0;right:var(--bp-space-020);pointer-events:none;background:linear-gradient(to bottom, #fff0 10%, #ffffffbf 18%, #fffffff7 28%, var(--bp-canvas-background,var(--surface-surface)) 71%);justify-content:flex-end;width:auto;position:absolute}._editorHasScroll_oercc_232 ._actionsWrapper_oercc_194 ._actionsWrapperInner_oercc_204>*{pointer-events:auto}._editorHasScroll_oercc_232 ._actionsWrapper_oercc_194 ._actionsWrapperInner_oercc_204._characterLimitExceeded_oercc_265{padding-top:var(--gradient-fade-height,var(--bp-size-040))}._editorHasScroll_oercc_232 ._actionsWrapper_oercc_194 ._actionsWrapperInner_oercc_204._scrolledToBottom_oercc_268{background:0 0}._anchorElement_oercc_272{pointer-events:none;width:100%;height:100%;position:absolute;top:0;left:0}._messageEditor_oercc_29 ._actionsWrapper_oercc_194._withTimestampToggle_oercc_281,._messageEditor_oercc_29 ._actionsWrapper_oercc_194._withTimestampToggle_oercc_281 ._actionsWrapperInner_oercc_204{width:100%}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.
|
|
1
|
+
._textMessage_g9go2_29{flex-direction:column;flex:1;width:100%;height:100%;display:flex;position:relative;overflow:visible}._textMessage_g9go2_29 ._contentWrapper_g9go2_38{gap:var(--space-2);margin-top:.125rem;display:flex}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._threadedIndicator_g9go2_43{width:var(--space-7);flex-shrink:0;position:relative}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._threadedIndicator_g9go2_43:after{content:"";left:50%;top:var(--space-05);bottom:var(--space-05);width:var(--border-2);background-color:var(--border-divider-border);border-radius:var(--radius-1);position:absolute;transform:translate(-50%)}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._threadedIndicatorHidden_g9go2_59:after{visibility:hidden}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62{overflow-wrap:break-word;flex-direction:column;flex:1;min-width:0;display:flex}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 strong{font-weight:var(--bp-font-weight-bold);font-style:inherit}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 em{font-style:italic;font-weight:inherit}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ul,._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ol{margin:0;padding-inline-start:var(--bp-space-060)}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ul,._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ul>li{list-style-type:disc}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ol,._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ol>li{list-style-type:decimal}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ul ul,._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ul ol,._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ol ul,._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ol ol{margin-block-start:var(--bp-space-005)}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 li p{margin:0}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ._inlineEditSlot_g9go2_99{margin-top:var(--space-2)}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageContent_g9go2_62 ._annotationBadgeWrapper_g9go2_102{min-width:0;max-width:100%;padding-bottom:var(--space-1);flex-direction:column;align-items:flex-start;display:flex;overflow:hidden}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageFooter_g9go2_111{align-items:center;gap:var(--space-1);padding-bottom:var(--space-2);margin-top:var(--space-1);flex-direction:row;display:flex}._textMessage_g9go2_29 ._contentWrapper_g9go2_38 ._messageFooter_g9go2_111 ._readableTimeWrapper_g9go2_119{cursor:auto}._replyButton_g9go2_123{padding-top:var(--space-05);padding-bottom:var(--space-05);opacity:0;transition:opacity .1s}[data-message-wrapper]:hover ._replyButton_g9go2_123,[data-message-wrapper]:focus-within ._replyButton_g9go2_123{opacity:1}@media (pointer:coarse),(hover:none){._replyButton_g9go2_123{opacity:1}}._seeMoreButton_g9go2_138{margin-inline-start:var(--bp-space-010)}._richTextList_g9go2_142 li{margin:0;padding:0}._richTextList_g9go2_142 li+li{margin-block-start:var(--bp-space-005)}
|
package/dist/types/index.d.ts
CHANGED
|
@@ -11,3 +11,5 @@ export { AnnotationBadgeType } from './lib/v2/types/annotation-badge-types';
|
|
|
11
11
|
export type { AnnotationBadgeTargetType } from './lib/v2/types/annotation-badge-types';
|
|
12
12
|
export { isKnownBlockNode, isListNode } from './lib/v2/utils/document-node-guards';
|
|
13
13
|
export { serializeMentionMarkup } from './lib/v2/utils/serialize-mention-markup';
|
|
14
|
+
export { parseMessageMarkdown } from './lib/v2/utils/parse-message-markdown';
|
|
15
|
+
export { serializeMessageToMarkdown } from './lib/v2/utils/serialize-message-to-markdown';
|
|
@@ -37,6 +37,8 @@ interface BaseMessageEditorProps {
|
|
|
37
37
|
isReply?: boolean;
|
|
38
38
|
/** Optional initial editor content used to prefill the editor (both edit and post modes). */
|
|
39
39
|
initialContent?: JSONContent | string | null;
|
|
40
|
+
/** Fires on every document change, including programmatic `setContent`. Null when empty. */
|
|
41
|
+
onChange?: (content: JSONContent | null) => void;
|
|
40
42
|
/**
|
|
41
43
|
* When true, enables the rich text experience: bold/italic/underline marks, bullet and numbered
|
|
42
44
|
* lists, the selection formatting bar, and their keyboard shortcuts and input rules. Defaults to
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { JSONContent } from '@tiptap/react';
|
|
2
|
+
/** Prepends a Reply mention onto an in-progress draft; no-op if the draft already leads with the same user. */
|
|
3
|
+
export declare const mergeMentionIntoDraft: (mentionDoc: JSONContent | null, draft: JSONContent | null) => JSONContent | null;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { DocumentNode } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Parses a v1 rich-text wire string into a v2 DocumentNode.
|
|
4
|
+
* Always returns a valid `doc` — empty string / null → `{ type: 'doc', content: [] }`.
|
|
5
|
+
*/
|
|
6
|
+
export declare const parseMessageMarkdown: (markdown: string | null | undefined) => DocumentNode;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DocumentNode } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* Serializes a v2 DocumentNode to a rich-text markdown string:
|
|
4
|
+
* `**bold**`, `_italic_`, `++underline++`, `-` / `1.` lists, `@[id:name]` mentions.
|
|
5
|
+
*
|
|
6
|
+
* Empty / null documents return `''`. Hosts still use `serializeMentionMarkup`
|
|
7
|
+
* for the plain tagged path.
|
|
8
|
+
*/
|
|
9
|
+
export declare const serializeMessageToMarkdown: (doc: DocumentNode | null | undefined) => string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@box/threaded-annotations",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.11.0",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"dependencies": {
|
|
6
6
|
"@floating-ui/dom": "^1.6.0",
|
|
@@ -18,26 +18,28 @@
|
|
|
18
18
|
"@tiptap/pm": "3.26.1",
|
|
19
19
|
"@tiptap/react": "3.26.1",
|
|
20
20
|
"@tiptap/suggestion": "3.26.1",
|
|
21
|
+
"markdown-it": "^14.2.0",
|
|
21
22
|
"uuid": "^9.0.1"
|
|
22
23
|
},
|
|
23
24
|
"peerDependencies": {
|
|
24
|
-
"@box/blueprint-web": "^17.8.
|
|
25
|
-
"@box/blueprint-web-assets": "^5.10.
|
|
26
|
-
"@box/collaboration-popover": "^2.2.
|
|
27
|
-
"@box/readable-time": "^2.2.
|
|
28
|
-
"@box/user-selector": "^3.0.
|
|
25
|
+
"@box/blueprint-web": "^17.8.1",
|
|
26
|
+
"@box/blueprint-web-assets": "^5.10.2",
|
|
27
|
+
"@box/collaboration-popover": "^2.2.46",
|
|
28
|
+
"@box/readable-time": "^2.2.46",
|
|
29
|
+
"@box/user-selector": "^3.0.25",
|
|
29
30
|
"clsx": "^1.2.1",
|
|
30
31
|
"react": "^18.0.0",
|
|
31
32
|
"react-dom": "^18.0.0",
|
|
32
33
|
"react-intl": "^6.4.2"
|
|
33
34
|
},
|
|
34
35
|
"devDependencies": {
|
|
35
|
-
"@box/blueprint-web": "^17.8.
|
|
36
|
-
"@box/blueprint-web-assets": "^5.10.
|
|
37
|
-
"@box/eslint-plugin-blueprint": "2.2.
|
|
38
|
-
"@box/readable-time": "^2.2.
|
|
39
|
-
"@box/storybook-utils": "^1.2.
|
|
40
|
-
"@box/user-selector": "^3.0.
|
|
36
|
+
"@box/blueprint-web": "^17.8.1",
|
|
37
|
+
"@box/blueprint-web-assets": "^5.10.2",
|
|
38
|
+
"@box/eslint-plugin-blueprint": "2.2.15",
|
|
39
|
+
"@box/readable-time": "^2.2.46",
|
|
40
|
+
"@box/storybook-utils": "^1.2.46",
|
|
41
|
+
"@box/user-selector": "^3.0.25",
|
|
42
|
+
"@types/markdown-it": "^14.1.2",
|
|
41
43
|
"react": "^18.0.0",
|
|
42
44
|
"react-dom": "^18.0.0"
|
|
43
45
|
},
|