@liveblocks/react-tiptap 3.9.1 → 3.9.2-tiptap2
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/LiveblocksExtension.cjs +7 -3
- package/dist/LiveblocksExtension.cjs.map +1 -1
- package/dist/LiveblocksExtension.js +7 -3
- package/dist/LiveblocksExtension.js.map +1 -1
- package/dist/ai/AiExtension.cjs +8 -0
- package/dist/ai/AiExtension.cjs.map +1 -1
- package/dist/ai/AiExtension.js +8 -0
- package/dist/ai/AiExtension.js.map +1 -1
- package/dist/ai/AiToolbar.cjs +256 -235
- package/dist/ai/AiToolbar.cjs.map +1 -1
- package/dist/ai/AiToolbar.js +256 -235
- package/dist/ai/AiToolbar.js.map +1 -1
- package/dist/comments/AnchoredThreads.cjs +63 -50
- package/dist/comments/AnchoredThreads.cjs.map +1 -1
- package/dist/comments/AnchoredThreads.js +63 -50
- package/dist/comments/AnchoredThreads.js.map +1 -1
- package/dist/comments/CommentsExtension.cjs +3 -0
- package/dist/comments/CommentsExtension.cjs.map +1 -1
- package/dist/comments/CommentsExtension.js +3 -0
- package/dist/comments/CommentsExtension.js.map +1 -1
- package/dist/comments/FloatingComposer.cjs +32 -22
- package/dist/comments/FloatingComposer.cjs.map +1 -1
- package/dist/comments/FloatingComposer.js +32 -22
- package/dist/comments/FloatingComposer.js.map +1 -1
- package/dist/comments/FloatingThreads.cjs +39 -33
- package/dist/comments/FloatingThreads.cjs.map +1 -1
- package/dist/comments/FloatingThreads.js +39 -33
- package/dist/comments/FloatingThreads.js.map +1 -1
- package/dist/context.cjs +1 -4
- package/dist/context.cjs.map +1 -1
- package/dist/context.js +1 -4
- package/dist/context.js.map +1 -1
- package/dist/index.d.cts +135 -4
- package/dist/index.d.ts +135 -4
- package/dist/mentions/GroupMentionNode.cjs +2 -0
- package/dist/mentions/GroupMentionNode.cjs.map +1 -1
- package/dist/mentions/GroupMentionNode.js +2 -0
- package/dist/mentions/GroupMentionNode.js.map +1 -1
- package/dist/mentions/Mention.cjs +35 -42
- package/dist/mentions/Mention.cjs.map +1 -1
- package/dist/mentions/Mention.js +34 -41
- package/dist/mentions/Mention.js.map +1 -1
- package/dist/mentions/MentionExtension.cjs +1 -0
- package/dist/mentions/MentionExtension.cjs.map +1 -1
- package/dist/mentions/MentionExtension.js +1 -0
- package/dist/mentions/MentionExtension.js.map +1 -1
- package/dist/mentions/MentionNode.cjs +2 -0
- package/dist/mentions/MentionNode.cjs.map +1 -1
- package/dist/mentions/MentionNode.js +2 -0
- package/dist/mentions/MentionNode.js.map +1 -1
- package/dist/mentions/MentionsList.cjs +66 -51
- package/dist/mentions/MentionsList.cjs.map +1 -1
- package/dist/mentions/MentionsList.js +66 -51
- package/dist/mentions/MentionsList.js.map +1 -1
- package/dist/toolbar/FloatingToolbar.cjs +43 -28
- package/dist/toolbar/FloatingToolbar.cjs.map +1 -1
- package/dist/toolbar/FloatingToolbar.js +43 -28
- package/dist/toolbar/FloatingToolbar.js.map +1 -1
- package/dist/toolbar/Toolbar.cjs +191 -153
- package/dist/toolbar/Toolbar.cjs.map +1 -1
- package/dist/toolbar/Toolbar.js +191 -153
- package/dist/toolbar/Toolbar.js.map +1 -1
- package/dist/toolbar/shared.cjs +12 -11
- package/dist/toolbar/shared.cjs.map +1 -1
- package/dist/toolbar/shared.js +12 -11
- package/dist/toolbar/shared.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.js.map +1 -1
- package/dist/version-history/HistoryVersionPreview.cjs +30 -42
- package/dist/version-history/HistoryVersionPreview.cjs.map +1 -1
- package/dist/version-history/HistoryVersionPreview.js +30 -42
- package/dist/version-history/HistoryVersionPreview.js.map +1 -1
- package/dist/version.cjs +1 -1
- package/dist/version.cjs.map +1 -1
- package/dist/version.js +1 -1
- package/dist/version.js.map +1 -1
- package/package.json +14 -14
- package/src/styles/index.css +3 -2
- package/styles.css +1 -1
- package/styles.css.map +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import { ContextualPromptContext, ContextualPromptResponse, ThreadData, MentionData, BaseMetadata, DM, HistoryVersion } from '@liveblocks/core';
|
|
2
|
-
import {
|
|
1
|
+
import { ContextualPromptContext, ContextualPromptResponse, ThreadData, Relax, MentionData, BaseMetadata, DM, HistoryVersion } from '@liveblocks/core';
|
|
2
|
+
import { LiveblocksYjsProvider } from '@liveblocks/yjs';
|
|
3
|
+
import { Content, Range, Extension, Node } from '@tiptap/core';
|
|
4
|
+
import { Doc, PermanentUserData, Snapshot } from 'yjs';
|
|
3
5
|
import * as react from 'react';
|
|
4
6
|
import { ComponentProps, ReactNode, ComponentType, PropsWithChildren, ComponentPropsWithoutRef, HTMLAttributes } from 'react';
|
|
5
7
|
import { Editor } from '@tiptap/react';
|
|
@@ -55,6 +57,135 @@ type LiveblocksExtensionOptions = {
|
|
|
55
57
|
initialContent?: Content;
|
|
56
58
|
enablePermanentUserData?: boolean;
|
|
57
59
|
};
|
|
60
|
+
type LiveblocksExtensionStorage = {
|
|
61
|
+
unsubs: (() => void)[];
|
|
62
|
+
doc: Doc;
|
|
63
|
+
provider: LiveblocksYjsProvider;
|
|
64
|
+
permanentUserData?: PermanentUserData;
|
|
65
|
+
};
|
|
66
|
+
type CommentsExtensionStorage = {
|
|
67
|
+
pendingComment: boolean;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* The state of the AI toolbar.
|
|
71
|
+
*
|
|
72
|
+
* ┌────────────────────────────────────────────────────────────────────────────────┐
|
|
73
|
+
* │ │
|
|
74
|
+
* │ ┌──────────────────────────────────────────────┐ │
|
|
75
|
+
* ▼ ▼ │ │
|
|
76
|
+
* ┌───────$closeAiToolbar()───────┐ │ │
|
|
77
|
+
* ▼ ◇ ◇ ◇
|
|
78
|
+
* ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐ ┌───────────────────────┐
|
|
79
|
+
* │ CLOSED │ │ ASKING │ │ THINKING │ │ REVIEWING │
|
|
80
|
+
* └───────────────────────┘ └───────────────────────┘ └───────────────────────┘ └───────────────────────┘
|
|
81
|
+
* ▲ ◇ ◇ ▲ ▲ ◇ ▲ ▲ ◇ ▲ ◇ ◇
|
|
82
|
+
* │ │ └───$openAiToolbarAsking()──┘ │ │ └ ─ ─ ─ ─ ─ ─⚠─ ─ ─ ─ ─ ─ ─│─├── ─ ─ ─ ─ ─ ─✓─ ─ ─ ─ ─ ─ ─ ┘ │ │
|
|
83
|
+
* │ │ │ ▼ │ │ │ │
|
|
84
|
+
* │ └─────────────────$startAiToolbarThinking(prompt)──────────────┘ │ │ │
|
|
85
|
+
* │ │ ▲ │ │ │
|
|
86
|
+
* │ │ └──────────────────────────────┼───────────────────────────────┘ │
|
|
87
|
+
* │ │ │ │
|
|
88
|
+
* │ └───$cancelAiToolbarThinking()───┘ │
|
|
89
|
+
* │ │
|
|
90
|
+
* └─────────────────────────────────────$acceptAiToolbarResponse()─────────────────────────────────────┘
|
|
91
|
+
*
|
|
92
|
+
*/
|
|
93
|
+
type AiToolbarState = Relax<{
|
|
94
|
+
phase: "closed";
|
|
95
|
+
} | {
|
|
96
|
+
phase: "asking";
|
|
97
|
+
/**
|
|
98
|
+
* The selection stored when opening the AI toolbar.
|
|
99
|
+
*/
|
|
100
|
+
initialSelection: Range;
|
|
101
|
+
/**
|
|
102
|
+
* The custom prompt being written in the toolbar.
|
|
103
|
+
*/
|
|
104
|
+
customPrompt: string;
|
|
105
|
+
/**
|
|
106
|
+
* A potential error that occurred during the last AI request.
|
|
107
|
+
*/
|
|
108
|
+
error?: Error;
|
|
109
|
+
} | {
|
|
110
|
+
phase: "thinking";
|
|
111
|
+
/**
|
|
112
|
+
* The selection stored when opening the AI toolbar.
|
|
113
|
+
*/
|
|
114
|
+
initialSelection: Range;
|
|
115
|
+
/**
|
|
116
|
+
* The custom prompt being written in the toolbar.
|
|
117
|
+
*/
|
|
118
|
+
customPrompt: string;
|
|
119
|
+
/**
|
|
120
|
+
* An abort controller to cancel the AI request.
|
|
121
|
+
*/
|
|
122
|
+
abortController: AbortController;
|
|
123
|
+
/**
|
|
124
|
+
* The prompt sent to the AI.
|
|
125
|
+
*/
|
|
126
|
+
prompt: string;
|
|
127
|
+
/**
|
|
128
|
+
* The previous response if this "thinking" phase is a refinement.
|
|
129
|
+
*/
|
|
130
|
+
previousResponse?: ContextualPromptResponse;
|
|
131
|
+
} | {
|
|
132
|
+
phase: "reviewing";
|
|
133
|
+
/**
|
|
134
|
+
* The selection stored when opening the AI toolbar.
|
|
135
|
+
*/
|
|
136
|
+
initialSelection: Range;
|
|
137
|
+
/**
|
|
138
|
+
* The custom prompt being written in the toolbar.
|
|
139
|
+
*/
|
|
140
|
+
customPrompt: string;
|
|
141
|
+
/**
|
|
142
|
+
* The prompt sent to the AI.
|
|
143
|
+
*/
|
|
144
|
+
prompt: string;
|
|
145
|
+
/**
|
|
146
|
+
* The response of the AI request.
|
|
147
|
+
*/
|
|
148
|
+
response: ContextualPromptResponse;
|
|
149
|
+
}>;
|
|
150
|
+
type AiExtensionStorage = {
|
|
151
|
+
name: string;
|
|
152
|
+
state: AiToolbarState;
|
|
153
|
+
snapshot?: Snapshot;
|
|
154
|
+
};
|
|
155
|
+
declare module "@tiptap/core" {
|
|
156
|
+
interface Storage {
|
|
157
|
+
liveblocksAi: AiExtensionStorage;
|
|
158
|
+
liveblocksExtension: LiveblocksExtensionStorage;
|
|
159
|
+
liveblocksComments: CommentsExtensionStorage;
|
|
160
|
+
}
|
|
161
|
+
interface Commands<ReturnType> {
|
|
162
|
+
collaborationCaret: {
|
|
163
|
+
/**
|
|
164
|
+
* Update details of the current user
|
|
165
|
+
* @example editor.commands.updateUser({ name: 'John Doe', color: '#305500' })
|
|
166
|
+
*/
|
|
167
|
+
updateUser: (attributes: Record<string, any>) => ReturnType;
|
|
168
|
+
/**
|
|
169
|
+
* Update details of the current user
|
|
170
|
+
*
|
|
171
|
+
* @deprecated The "user" command is deprecated. Please use "updateUser" instead. Read more: https://tiptap.dev/api/extensions/collaboration-caret
|
|
172
|
+
*/
|
|
173
|
+
user: (attributes: Record<string, any>) => ReturnType;
|
|
174
|
+
};
|
|
175
|
+
collaboration: {
|
|
176
|
+
/**
|
|
177
|
+
* Undo recent changes
|
|
178
|
+
* @example editor.commands.undo()
|
|
179
|
+
*/
|
|
180
|
+
undo: () => ReturnType;
|
|
181
|
+
/**
|
|
182
|
+
* Reapply reverted changes
|
|
183
|
+
* @example editor.commands.redo()
|
|
184
|
+
*/
|
|
185
|
+
redo: () => ReturnType;
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
58
189
|
type FloatingPosition = "top" | "bottom";
|
|
59
190
|
type CommentsCommands<ReturnType = boolean> = {
|
|
60
191
|
/**
|
|
@@ -192,7 +323,7 @@ declare function FloatingThreads({ threads, components, editor, ...props }: Floa
|
|
|
192
323
|
declare function useIsEditorReady(): boolean;
|
|
193
324
|
declare const useLiveblocksExtension: (opts?: LiveblocksExtensionOptions) => Extension;
|
|
194
325
|
|
|
195
|
-
declare const GroupMentionNode: Node<
|
|
326
|
+
declare const GroupMentionNode: Node<any, any>;
|
|
196
327
|
|
|
197
328
|
type MentionExtensionOptions = {
|
|
198
329
|
onCreateMention: (mention: TiptapMentionData) => void;
|
|
@@ -200,7 +331,7 @@ type MentionExtensionOptions = {
|
|
|
200
331
|
};
|
|
201
332
|
declare const MentionExtension: Extension<MentionExtensionOptions, any>;
|
|
202
333
|
|
|
203
|
-
declare const MentionNode: Node<
|
|
334
|
+
declare const MentionNode: Node<any, any>;
|
|
204
335
|
|
|
205
336
|
interface ToolbarSlotProps {
|
|
206
337
|
editor: Editor;
|
|
@@ -38,6 +38,7 @@ const GroupMentionNode = core.Node.create({
|
|
|
38
38
|
}
|
|
39
39
|
return {
|
|
40
40
|
"data-id": attributes.id
|
|
41
|
+
// "as" typing because TipTap doesn't have a way to type attributes
|
|
41
42
|
};
|
|
42
43
|
}
|
|
43
44
|
},
|
|
@@ -73,6 +74,7 @@ const GroupMentionNode = core.Node.create({
|
|
|
73
74
|
}
|
|
74
75
|
return {
|
|
75
76
|
"data-notification-id": attributes.notificationId
|
|
77
|
+
// "as" typing because TipTap doesn't have a way to type attributes
|
|
76
78
|
};
|
|
77
79
|
}
|
|
78
80
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMentionNode.cjs","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create
|
|
1
|
+
{"version":3,"file":"GroupMentionNode.cjs","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create({\n name: LIVEBLOCKS_GROUP_MENTION_TYPE,\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n priority: 101,\n parseHTML() {\n return [\n {\n tag: \"liveblocks-group-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-group-mention\", mergeAttributes(HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Mention, {\n contentDOMElementTag: \"span\",\n });\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n \"data-id\": attributes.id as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n userIds: {\n default: undefined,\n parseHTML: (element) => {\n const userIdsAttribute = element.getAttribute(\"data-user-ids\");\n\n if (!userIdsAttribute) {\n return undefined;\n }\n\n try {\n const userIds = JSON.parse(userIdsAttribute) as string[];\n\n return Array.isArray(userIds) ? userIds : undefined;\n } catch {\n return undefined;\n }\n },\n renderHTML: (attributes) => {\n if (!attributes.userIds || !Array.isArray(attributes.userIds)) {\n return {};\n }\n\n return {\n \"data-user-ids\": JSON.stringify(attributes.userIds),\n };\n },\n },\n notificationId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-notification-id\"),\n renderHTML: (attributes) => {\n if (!attributes.notificationId) {\n return {};\n }\n\n return {\n \"data-notification-id\": attributes.notificationId as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\"\", pos, pos + node.nodeSize);\n }\n });\n\n return isMention;\n }),\n };\n },\n});\n"],"names":["Node","LIVEBLOCKS_GROUP_MENTION_TYPE","mergeAttributes","ReactNodeViewRenderer","Mention"],"mappings":";;;;;;;AAMa,MAAA,gBAAA,GAAmBA,UAAK,MAAO,CAAA;AAAA,EAC1C,IAAM,EAAAC,mCAAA;AAAA,EACN,KAAO,EAAA,QAAA;AAAA,EACP,MAAQ,EAAA,IAAA;AAAA,EACR,UAAY,EAAA,IAAA;AAAA,EACZ,IAAM,EAAA,IAAA;AAAA,EAEN,QAAU,EAAA,GAAA;AAAA,EACV,SAAY,GAAA;AACV,IAAO,OAAA;AAAA,MACL;AAAA,QACE,GAAK,EAAA,0BAAA;AAAA,OACP;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EAEA,UAAA,CAAW,EAAE,cAAA,EAAkB,EAAA;AAC7B,IAAA,OAAO,CAAC,0BAAA,EAA4BC,oBAAgB,CAAA,cAAc,CAAC,CAAA,CAAA;AAAA,GACrE;AAAA,EAEA,WAAc,GAAA;AACZ,IAAA,OAAOC,4BAAsBC,eAAS,EAAA;AAAA,MACpC,oBAAsB,EAAA,MAAA;AAAA,KACvB,CAAA,CAAA;AAAA,GACH;AAAA,EAEA,aAAgB,GAAA;AACd,IAAO,OAAA;AAAA,MACL,EAAI,EAAA;AAAA,QACF,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,SAAS,CAAA;AAAA,QACtD,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,EAAI,EAAA;AAClB,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,WAAW,UAAW,CAAA,EAAA;AAAA;AAAA,WACxB,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,OAAS,EAAA;AAAA,QACP,OAAS,EAAA,KAAA,CAAA;AAAA,QACT,SAAA,EAAW,CAAC,OAAY,KAAA;AACtB,UAAM,MAAA,gBAAA,GAAmB,OAAQ,CAAA,YAAA,CAAa,eAAe,CAAA,CAAA;AAE7D,UAAA,IAAI,CAAC,gBAAkB,EAAA;AACrB,YAAO,OAAA,KAAA,CAAA,CAAA;AAAA,WACT;AAEA,UAAI,IAAA;AACF,YAAM,MAAA,OAAA,GAAU,IAAK,CAAA,KAAA,CAAM,gBAAgB,CAAA,CAAA;AAE3C,YAAA,OAAO,KAAM,CAAA,OAAA,CAAQ,OAAO,CAAA,GAAI,OAAU,GAAA,KAAA,CAAA,CAAA;AAAA,WACpC,CAAA,MAAA;AACN,YAAO,OAAA,KAAA,CAAA,CAAA;AAAA,WACT;AAAA,SACF;AAAA,QACA,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,OAAW,IAAA,CAAC,MAAM,OAAQ,CAAA,UAAA,CAAW,OAAO,CAAG,EAAA;AAC7D,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,eAAiB,EAAA,IAAA,CAAK,SAAU,CAAA,UAAA,CAAW,OAAO,CAAA;AAAA,WACpD,CAAA;AAAA,SACF;AAAA,OACF;AAAA,MACA,cAAgB,EAAA;AAAA,QACd,OAAS,EAAA,IAAA;AAAA,QACT,SAAW,EAAA,CAAC,OAAY,KAAA,OAAA,CAAQ,aAAa,sBAAsB,CAAA;AAAA,QACnE,UAAA,EAAY,CAAC,UAAe,KAAA;AAC1B,UAAI,IAAA,CAAC,WAAW,cAAgB,EAAA;AAC9B,YAAA,OAAO,EAAC,CAAA;AAAA,WACV;AAEA,UAAO,OAAA;AAAA,YACL,wBAAwB,UAAW,CAAA,cAAA;AAAA;AAAA,WACrC,CAAA;AAAA,SACF;AAAA,OACF;AAAA,KACF,CAAA;AAAA,GACF;AAAA,EACA,oBAAuB,GAAA;AACrB,IAAO,OAAA;AAAA,MACL,SAAA,EAAW,MACT,IAAA,CAAK,MAAO,CAAA,QAAA,CAAS,QAAQ,CAAC,EAAE,EAAI,EAAA,KAAA,EAAY,KAAA;AAC9C,QAAA,IAAI,SAAY,GAAA,KAAA,CAAA;AAChB,QAAM,MAAA,EAAE,WAAc,GAAA,KAAA,CAAA;AACtB,QAAM,MAAA,EAAE,KAAO,EAAA,MAAA,EAAW,GAAA,SAAA,CAAA;AAE1B,QAAA,IAAI,CAAC,KAAO,EAAA;AACV,UAAO,OAAA,KAAA,CAAA;AAAA,SACT;AAEA,QAAA,KAAA,CAAM,IAAI,YAAa,CAAA,MAAA,GAAS,GAAG,MAAQ,EAAA,CAAC,MAAM,GAAQ,KAAA;AACxD,UAAA,IAAI,IAAK,CAAA,IAAA,CAAK,IAAS,KAAA,IAAA,CAAK,IAAM,EAAA;AAChC,YAAY,SAAA,GAAA,IAAA,CAAA;AACZ,YAAA,EAAA,CAAG,UAAW,CAAA,EAAA,EAAI,GAAK,EAAA,GAAA,GAAM,KAAK,QAAQ,CAAA,CAAA;AAAA,WAC5C;AAAA,SACD,CAAA,CAAA;AAED,QAAO,OAAA,SAAA,CAAA;AAAA,OACR,CAAA;AAAA,KACL,CAAA;AAAA,GACF;AACF,CAAC;;;;"}
|
|
@@ -36,6 +36,7 @@ const GroupMentionNode = Node.create({
|
|
|
36
36
|
}
|
|
37
37
|
return {
|
|
38
38
|
"data-id": attributes.id
|
|
39
|
+
// "as" typing because TipTap doesn't have a way to type attributes
|
|
39
40
|
};
|
|
40
41
|
}
|
|
41
42
|
},
|
|
@@ -71,6 +72,7 @@ const GroupMentionNode = Node.create({
|
|
|
71
72
|
}
|
|
72
73
|
return {
|
|
73
74
|
"data-notification-id": attributes.notificationId
|
|
75
|
+
// "as" typing because TipTap doesn't have a way to type attributes
|
|
74
76
|
};
|
|
75
77
|
}
|
|
76
78
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GroupMentionNode.js","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create
|
|
1
|
+
{"version":3,"file":"GroupMentionNode.js","sources":["../../src/mentions/GroupMentionNode.ts"],"sourcesContent":["import { mergeAttributes, Node } from \"@tiptap/core\";\nimport { ReactNodeViewRenderer } from \"@tiptap/react\";\n\nimport { LIVEBLOCKS_GROUP_MENTION_TYPE } from \"../types\";\nimport { Mention } from \"./Mention\";\n\nexport const GroupMentionNode = Node.create({\n name: LIVEBLOCKS_GROUP_MENTION_TYPE,\n group: \"inline\",\n inline: true,\n selectable: true,\n atom: true,\n\n priority: 101,\n parseHTML() {\n return [\n {\n tag: \"liveblocks-group-mention\",\n },\n ];\n },\n\n renderHTML({ HTMLAttributes }) {\n return [\"liveblocks-group-mention\", mergeAttributes(HTMLAttributes)];\n },\n\n addNodeView() {\n return ReactNodeViewRenderer(Mention, {\n contentDOMElementTag: \"span\",\n });\n },\n\n addAttributes() {\n return {\n id: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-id\"),\n renderHTML: (attributes) => {\n if (!attributes.id) {\n return {};\n }\n\n return {\n \"data-id\": attributes.id as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n userIds: {\n default: undefined,\n parseHTML: (element) => {\n const userIdsAttribute = element.getAttribute(\"data-user-ids\");\n\n if (!userIdsAttribute) {\n return undefined;\n }\n\n try {\n const userIds = JSON.parse(userIdsAttribute) as string[];\n\n return Array.isArray(userIds) ? userIds : undefined;\n } catch {\n return undefined;\n }\n },\n renderHTML: (attributes) => {\n if (!attributes.userIds || !Array.isArray(attributes.userIds)) {\n return {};\n }\n\n return {\n \"data-user-ids\": JSON.stringify(attributes.userIds),\n };\n },\n },\n notificationId: {\n default: null,\n parseHTML: (element) => element.getAttribute(\"data-notification-id\"),\n renderHTML: (attributes) => {\n if (!attributes.notificationId) {\n return {};\n }\n\n return {\n \"data-notification-id\": attributes.notificationId as string, // \"as\" typing because TipTap doesn't have a way to type attributes\n };\n },\n },\n };\n },\n addKeyboardShortcuts() {\n return {\n Backspace: () =>\n this.editor.commands.command(({ tr, state }) => {\n let isMention = false;\n const { selection } = state;\n const { empty, anchor } = selection;\n\n if (!empty) {\n return false;\n }\n\n state.doc.nodesBetween(anchor - 1, anchor, (node, pos) => {\n if (node.type.name === this.name) {\n isMention = true;\n tr.insertText(\"\", pos, pos + node.nodeSize);\n }\n });\n\n return isMention;\n }),\n };\n },\n});\n"],"names":[],"mappings":"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"}
|
|
@@ -3,52 +3,41 @@
|
|
|
3
3
|
var jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
var core = require('@liveblocks/core');
|
|
5
5
|
var _private = require('@liveblocks/react-ui/_private');
|
|
6
|
-
var react
|
|
7
|
-
var react = require('react');
|
|
6
|
+
var react = require('@tiptap/react');
|
|
8
7
|
var types = require('../types.cjs');
|
|
9
8
|
|
|
10
|
-
const UserMention =
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
const UserMention = ({ isSelected, mention }) => {
|
|
10
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
11
|
+
react.NodeViewWrapper,
|
|
12
|
+
{
|
|
13
13
|
className: _private.cn(
|
|
14
14
|
"lb-root lb-mention lb-tiptap-mention",
|
|
15
15
|
isSelected && "lb-mention-selected"
|
|
16
16
|
),
|
|
17
17
|
as: "span",
|
|
18
|
-
ref: forwardedRef,
|
|
19
18
|
children: [
|
|
20
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
21
|
-
|
|
22
|
-
children: core.MENTION_CHARACTER
|
|
23
|
-
}),
|
|
24
|
-
/* @__PURE__ */ jsxRuntime.jsx(_private.User, {
|
|
25
|
-
userId: mention.id
|
|
26
|
-
})
|
|
19
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
|
|
20
|
+
/* @__PURE__ */ jsxRuntime.jsx(_private.User, { userId: mention.id })
|
|
27
21
|
]
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const GroupMention =
|
|
32
|
-
|
|
33
|
-
|
|
22
|
+
}
|
|
23
|
+
);
|
|
24
|
+
};
|
|
25
|
+
const GroupMention = ({ isSelected, mention }) => {
|
|
26
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
27
|
+
react.NodeViewWrapper,
|
|
28
|
+
{
|
|
34
29
|
className: _private.cn(
|
|
35
30
|
"lb-root lb-mention lb-tiptap-mention",
|
|
36
31
|
isSelected && "lb-mention-selected"
|
|
37
32
|
),
|
|
38
33
|
as: "span",
|
|
39
|
-
ref: forwardedRef,
|
|
40
34
|
children: [
|
|
41
|
-
/* @__PURE__ */ jsxRuntime.jsx("span", {
|
|
42
|
-
|
|
43
|
-
children: core.MENTION_CHARACTER
|
|
44
|
-
}),
|
|
45
|
-
/* @__PURE__ */ jsxRuntime.jsx(_private.Group, {
|
|
46
|
-
groupId: mention.id
|
|
47
|
-
})
|
|
35
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "lb-mention-symbol", children: core.MENTION_CHARACTER }),
|
|
36
|
+
/* @__PURE__ */ jsxRuntime.jsx(_private.Group, { groupId: mention.id })
|
|
48
37
|
]
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
};
|
|
52
41
|
function deserializeGroupUserIds(userIds) {
|
|
53
42
|
if (typeof userIds !== "string") {
|
|
54
43
|
return void 0;
|
|
@@ -63,18 +52,20 @@ function deserializeGroupUserIds(userIds) {
|
|
|
63
52
|
return void 0;
|
|
64
53
|
}
|
|
65
54
|
}
|
|
66
|
-
const Mention =
|
|
55
|
+
const Mention = ({ node, selected: isSelected }) => {
|
|
67
56
|
const attrs = node.attrs;
|
|
68
57
|
if (node.type.name === types.LIVEBLOCKS_MENTION_TYPE) {
|
|
69
58
|
const mention = {
|
|
70
59
|
kind: "user",
|
|
71
60
|
id: attrs.id
|
|
72
61
|
};
|
|
73
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
62
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
63
|
+
UserMention,
|
|
64
|
+
{
|
|
65
|
+
mention,
|
|
66
|
+
isSelected
|
|
67
|
+
}
|
|
68
|
+
);
|
|
78
69
|
}
|
|
79
70
|
if (node.type.name === types.LIVEBLOCKS_GROUP_MENTION_TYPE) {
|
|
80
71
|
const mention = {
|
|
@@ -82,14 +73,16 @@ const Mention = react.forwardRef(({ node, selected: isSelected }, forwardedRef)
|
|
|
82
73
|
id: attrs.id,
|
|
83
74
|
userIds: deserializeGroupUserIds(attrs.userIds)
|
|
84
75
|
};
|
|
85
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
76
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
77
|
+
GroupMention,
|
|
78
|
+
{
|
|
79
|
+
mention,
|
|
80
|
+
isSelected
|
|
81
|
+
}
|
|
82
|
+
);
|
|
90
83
|
}
|
|
91
84
|
return null;
|
|
92
|
-
}
|
|
85
|
+
};
|
|
93
86
|
|
|
94
87
|
exports.Mention = Mention;
|
|
95
88
|
//# sourceMappingURL=Mention.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mention.cjs","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport
|
|
1
|
+
{"version":3,"file":"Mention.cjs","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport { NodeViewWrapper, type ReactNodeViewProps } from \"@tiptap/react\";\n\nimport {\n LIVEBLOCKS_GROUP_MENTION_TYPE,\n LIVEBLOCKS_MENTION_TYPE,\n type SerializedTiptapMentionData,\n} from \"../types\";\n\ninterface MentionProps {\n mention: MentionData;\n isSelected: boolean;\n}\ninterface GroupMentionProps {\n mention: GroupMentionData;\n isSelected: boolean;\n}\n\nconst UserMention = ({ isSelected, mention }: MentionProps) => {\n\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <User userId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nconst GroupMention = ({ isSelected, mention }: GroupMentionProps) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <Group groupId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nfunction deserializeGroupUserIds(\n userIds: string | undefined\n): string[] | undefined {\n if (typeof userIds !== \"string\") {\n return undefined;\n }\n\n try {\n const parsedUserIds = JSON.parse(userIds) as string[];\n\n if (Array.isArray(parsedUserIds)) {\n return parsedUserIds;\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const Mention = ({ node, selected: isSelected }: ReactNodeViewProps<HTMLSpanElement>) => {\n const attrs = node.attrs as Omit<SerializedTiptapMentionData, \"kind\">;\n\n if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention: UserMentionData = {\n kind: \"user\",\n id: attrs.id,\n };\n\n return (\n <UserMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {\n const mention: GroupMentionData = {\n kind: \"group\",\n id: attrs.id,\n userIds: deserializeGroupUserIds(attrs.userIds),\n };\n\n return (\n <GroupMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n\n return null;\n};\n"],"names":["jsxs","NodeViewWrapper","cn","jsx","MENTION_CHARACTER","User","Group","LIVEBLOCKS_MENTION_TYPE","LIVEBLOCKS_GROUP_MENTION_TYPE"],"mappings":";;;;;;;;AAwBA,MAAM,WAAc,GAAA,CAAC,EAAE,UAAA,EAAY,SAA4B,KAAA;AAE7D,EACE,uBAAAA,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAC,WAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAAC,sBAAA,EAAA,CAAA;AAAA,wBACtDD,cAAA,CAAAE,aAAA,EAAA,EAAK,MAAQ,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC5B,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CAAC,EAAE,UAAA,EAAY,SAAiC,KAAA;AACnE,EACE,uBAAAL,eAAA;AAAA,IAACC,qBAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAAC,WAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAACC,cAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAAC,sBAAA,EAAA,CAAA;AAAA,wBACtDD,cAAA,CAAAG,cAAA,EAAA,EAAM,OAAS,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC9B,CAAA;AAEJ,CAAA,CAAA;AAEA,SAAS,wBACP,OACsB,EAAA;AACtB,EAAI,IAAA,OAAO,YAAY,QAAU,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA;AACF,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAExC,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACD,CAAA,MAAA;AACN,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEO,MAAM,UAAU,CAAC,EAAE,IAAM,EAAA,QAAA,EAAU,YAAsD,KAAA;AAC9F,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA;AAEnB,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAASC,6BAAyB,EAAA;AAC9C,IAAA,MAAM,OAA2B,GAAA;AAAA,MAC/B,IAAM,EAAA,MAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,KACZ,CAAA;AAEA,IACE,uBAAAJ,cAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AACA,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAASK,mCAA+B,EAAA;AACpD,IAAA,MAAM,OAA4B,GAAA;AAAA,MAChC,IAAM,EAAA,OAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,MACV,OAAA,EAAS,uBAAwB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,KAChD,CAAA;AAEA,IACE,uBAAAL,cAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
|
package/dist/mentions/Mention.js
CHANGED
|
@@ -2,51 +2,40 @@ import { jsxs, jsx } from 'react/jsx-runtime';
|
|
|
2
2
|
import { MENTION_CHARACTER } from '@liveblocks/core';
|
|
3
3
|
import { cn, User, Group } from '@liveblocks/react-ui/_private';
|
|
4
4
|
import { NodeViewWrapper } from '@tiptap/react';
|
|
5
|
-
import { forwardRef } from 'react';
|
|
6
5
|
import { LIVEBLOCKS_MENTION_TYPE, LIVEBLOCKS_GROUP_MENTION_TYPE } from '../types.js';
|
|
7
6
|
|
|
8
|
-
const UserMention =
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
const UserMention = ({ isSelected, mention }) => {
|
|
8
|
+
return /* @__PURE__ */ jsxs(
|
|
9
|
+
NodeViewWrapper,
|
|
10
|
+
{
|
|
11
11
|
className: cn(
|
|
12
12
|
"lb-root lb-mention lb-tiptap-mention",
|
|
13
13
|
isSelected && "lb-mention-selected"
|
|
14
14
|
),
|
|
15
15
|
as: "span",
|
|
16
|
-
ref: forwardedRef,
|
|
17
16
|
children: [
|
|
18
|
-
/* @__PURE__ */ jsx("span", {
|
|
19
|
-
|
|
20
|
-
children: MENTION_CHARACTER
|
|
21
|
-
}),
|
|
22
|
-
/* @__PURE__ */ jsx(User, {
|
|
23
|
-
userId: mention.id
|
|
24
|
-
})
|
|
17
|
+
/* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
|
|
18
|
+
/* @__PURE__ */ jsx(User, { userId: mention.id })
|
|
25
19
|
]
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const GroupMention =
|
|
30
|
-
|
|
31
|
-
|
|
20
|
+
}
|
|
21
|
+
);
|
|
22
|
+
};
|
|
23
|
+
const GroupMention = ({ isSelected, mention }) => {
|
|
24
|
+
return /* @__PURE__ */ jsxs(
|
|
25
|
+
NodeViewWrapper,
|
|
26
|
+
{
|
|
32
27
|
className: cn(
|
|
33
28
|
"lb-root lb-mention lb-tiptap-mention",
|
|
34
29
|
isSelected && "lb-mention-selected"
|
|
35
30
|
),
|
|
36
31
|
as: "span",
|
|
37
|
-
ref: forwardedRef,
|
|
38
32
|
children: [
|
|
39
|
-
/* @__PURE__ */ jsx("span", {
|
|
40
|
-
|
|
41
|
-
children: MENTION_CHARACTER
|
|
42
|
-
}),
|
|
43
|
-
/* @__PURE__ */ jsx(Group, {
|
|
44
|
-
groupId: mention.id
|
|
45
|
-
})
|
|
33
|
+
/* @__PURE__ */ jsx("span", { className: "lb-mention-symbol", children: MENTION_CHARACTER }),
|
|
34
|
+
/* @__PURE__ */ jsx(Group, { groupId: mention.id })
|
|
46
35
|
]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
|
|
36
|
+
}
|
|
37
|
+
);
|
|
38
|
+
};
|
|
50
39
|
function deserializeGroupUserIds(userIds) {
|
|
51
40
|
if (typeof userIds !== "string") {
|
|
52
41
|
return void 0;
|
|
@@ -61,18 +50,20 @@ function deserializeGroupUserIds(userIds) {
|
|
|
61
50
|
return void 0;
|
|
62
51
|
}
|
|
63
52
|
}
|
|
64
|
-
const Mention =
|
|
53
|
+
const Mention = ({ node, selected: isSelected }) => {
|
|
65
54
|
const attrs = node.attrs;
|
|
66
55
|
if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {
|
|
67
56
|
const mention = {
|
|
68
57
|
kind: "user",
|
|
69
58
|
id: attrs.id
|
|
70
59
|
};
|
|
71
|
-
return /* @__PURE__ */ jsx(
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
60
|
+
return /* @__PURE__ */ jsx(
|
|
61
|
+
UserMention,
|
|
62
|
+
{
|
|
63
|
+
mention,
|
|
64
|
+
isSelected
|
|
65
|
+
}
|
|
66
|
+
);
|
|
76
67
|
}
|
|
77
68
|
if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {
|
|
78
69
|
const mention = {
|
|
@@ -80,14 +71,16 @@ const Mention = forwardRef(({ node, selected: isSelected }, forwardedRef) => {
|
|
|
80
71
|
id: attrs.id,
|
|
81
72
|
userIds: deserializeGroupUserIds(attrs.userIds)
|
|
82
73
|
};
|
|
83
|
-
return /* @__PURE__ */ jsx(
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
74
|
+
return /* @__PURE__ */ jsx(
|
|
75
|
+
GroupMention,
|
|
76
|
+
{
|
|
77
|
+
mention,
|
|
78
|
+
isSelected
|
|
79
|
+
}
|
|
80
|
+
);
|
|
88
81
|
}
|
|
89
82
|
return null;
|
|
90
|
-
}
|
|
83
|
+
};
|
|
91
84
|
|
|
92
85
|
export { Mention };
|
|
93
86
|
//# sourceMappingURL=Mention.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Mention.js","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport
|
|
1
|
+
{"version":3,"file":"Mention.js","sources":["../../src/mentions/Mention.tsx"],"sourcesContent":["import {\n type GroupMentionData,\n MENTION_CHARACTER,\n type MentionData,\n type UserMentionData,\n} from \"@liveblocks/core\";\nimport { cn, Group, User } from \"@liveblocks/react-ui/_private\";\nimport { NodeViewWrapper, type ReactNodeViewProps } from \"@tiptap/react\";\n\nimport {\n LIVEBLOCKS_GROUP_MENTION_TYPE,\n LIVEBLOCKS_MENTION_TYPE,\n type SerializedTiptapMentionData,\n} from \"../types\";\n\ninterface MentionProps {\n mention: MentionData;\n isSelected: boolean;\n}\ninterface GroupMentionProps {\n mention: GroupMentionData;\n isSelected: boolean;\n}\n\nconst UserMention = ({ isSelected, mention }: MentionProps) => {\n\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <User userId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nconst GroupMention = ({ isSelected, mention }: GroupMentionProps) => {\n return (\n <NodeViewWrapper\n className={cn(\n \"lb-root lb-mention lb-tiptap-mention\",\n isSelected && \"lb-mention-selected\"\n )}\n as=\"span\"\n >\n <span className=\"lb-mention-symbol\">{MENTION_CHARACTER}</span>\n <Group groupId={mention.id} />\n </NodeViewWrapper>\n );\n};\n\nfunction deserializeGroupUserIds(\n userIds: string | undefined\n): string[] | undefined {\n if (typeof userIds !== \"string\") {\n return undefined;\n }\n\n try {\n const parsedUserIds = JSON.parse(userIds) as string[];\n\n if (Array.isArray(parsedUserIds)) {\n return parsedUserIds;\n }\n\n return undefined;\n } catch {\n return undefined;\n }\n}\n\nexport const Mention = ({ node, selected: isSelected }: ReactNodeViewProps<HTMLSpanElement>) => {\n const attrs = node.attrs as Omit<SerializedTiptapMentionData, \"kind\">;\n\n if (node.type.name === LIVEBLOCKS_MENTION_TYPE) {\n const mention: UserMentionData = {\n kind: \"user\",\n id: attrs.id,\n };\n\n return (\n <UserMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n if (node.type.name === LIVEBLOCKS_GROUP_MENTION_TYPE) {\n const mention: GroupMentionData = {\n kind: \"group\",\n id: attrs.id,\n userIds: deserializeGroupUserIds(attrs.userIds),\n };\n\n return (\n <GroupMention\n mention={mention}\n isSelected={isSelected}\n />\n );\n }\n\n return null;\n};\n"],"names":[],"mappings":";;;;;;AAwBA,MAAM,WAAc,GAAA,CAAC,EAAE,UAAA,EAAY,SAA4B,KAAA;AAE7D,EACE,uBAAA,IAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,EAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAA,iBAAA,EAAA,CAAA;AAAA,wBACtD,GAAA,CAAA,IAAA,EAAA,EAAK,MAAQ,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC5B,CAAA;AAEJ,CAAA,CAAA;AAEA,MAAM,YAAe,GAAA,CAAC,EAAE,UAAA,EAAY,SAAiC,KAAA;AACnE,EACE,uBAAA,IAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAW,EAAA,EAAA;AAAA,QACT,sCAAA;AAAA,QACA,UAAc,IAAA,qBAAA;AAAA,OAChB;AAAA,MACA,EAAG,EAAA,MAAA;AAAA,MAEH,QAAA,EAAA;AAAA,wBAAC,GAAA,CAAA,MAAA,EAAA,EAAK,SAAU,EAAA,mBAAA,EAAqB,QAAkB,EAAA,iBAAA,EAAA,CAAA;AAAA,wBACtD,GAAA,CAAA,KAAA,EAAA,EAAM,OAAS,EAAA,OAAA,CAAQ,EAAI,EAAA,CAAA;AAAA,OAAA;AAAA,KAAA;AAAA,GAC9B,CAAA;AAEJ,CAAA,CAAA;AAEA,SAAS,wBACP,OACsB,EAAA;AACtB,EAAI,IAAA,OAAO,YAAY,QAAU,EAAA;AAC/B,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AAEA,EAAI,IAAA;AACF,IAAM,MAAA,aAAA,GAAgB,IAAK,CAAA,KAAA,CAAM,OAAO,CAAA,CAAA;AAExC,IAAI,IAAA,KAAA,CAAM,OAAQ,CAAA,aAAa,CAAG,EAAA;AAChC,MAAO,OAAA,aAAA,CAAA;AAAA,KACT;AAEA,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACD,CAAA,MAAA;AACN,IAAO,OAAA,KAAA,CAAA,CAAA;AAAA,GACT;AACF,CAAA;AAEO,MAAM,UAAU,CAAC,EAAE,IAAM,EAAA,QAAA,EAAU,YAAsD,KAAA;AAC9F,EAAA,MAAM,QAAQ,IAAK,CAAA,KAAA,CAAA;AAEnB,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAAS,uBAAyB,EAAA;AAC9C,IAAA,MAAM,OAA2B,GAAA;AAAA,MAC/B,IAAM,EAAA,MAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,KACZ,CAAA;AAEA,IACE,uBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AACA,EAAI,IAAA,IAAA,CAAK,IAAK,CAAA,IAAA,KAAS,6BAA+B,EAAA;AACpD,IAAA,MAAM,OAA4B,GAAA;AAAA,MAChC,IAAM,EAAA,OAAA;AAAA,MACN,IAAI,KAAM,CAAA,EAAA;AAAA,MACV,OAAA,EAAS,uBAAwB,CAAA,KAAA,CAAM,OAAO,CAAA;AAAA,KAChD,CAAA;AAEA,IACE,uBAAA,GAAA;AAAA,MAAC,YAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,UAAA;AAAA,OAAA;AAAA,KACF,CAAA;AAAA,GAEJ;AAEA,EAAO,OAAA,IAAA,CAAA;AACT;;;;"}
|