@liveblocks/react-ui 2.25.0-aiprivatebeta14 → 2.25.0-aiprivatebeta16
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/_private/package.json +2 -2
- package/dist/components/Comment.cjs +254 -235
- package/dist/components/Comment.cjs.map +1 -1
- package/dist/components/Comment.js +255 -236
- package/dist/components/Comment.js.map +1 -1
- package/dist/components/Composer.cjs +39 -27
- package/dist/components/Composer.cjs.map +1 -1
- package/dist/components/Composer.js +41 -29
- package/dist/components/Composer.js.map +1 -1
- package/dist/components/Thread.cjs +7 -1
- package/dist/components/Thread.cjs.map +1 -1
- package/dist/components/Thread.js +8 -2
- package/dist/components/Thread.js.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.cjs +30 -2
- package/dist/components/internal/AiChatAssistantMessage.cjs.map +1 -1
- package/dist/components/internal/AiChatAssistantMessage.js +30 -2
- package/dist/components/internal/AiChatAssistantMessage.js.map +1 -1
- package/dist/components/internal/Dropdown.cjs +1 -1
- package/dist/components/internal/Dropdown.cjs.map +1 -1
- package/dist/components/internal/Dropdown.js +2 -2
- package/dist/components/internal/Dropdown.js.map +1 -1
- package/dist/components/internal/EmojiPicker.cjs +1 -1
- package/dist/components/internal/EmojiPicker.cjs.map +1 -1
- package/dist/components/internal/EmojiPicker.js +2 -2
- package/dist/components/internal/EmojiPicker.js.map +1 -1
- package/dist/components/internal/InboxNotificationThread.cjs +5 -2
- package/dist/components/internal/InboxNotificationThread.cjs.map +1 -1
- package/dist/components/internal/InboxNotificationThread.js +6 -3
- package/dist/components/internal/InboxNotificationThread.js.map +1 -1
- package/dist/components/internal/Tooltip.cjs +1 -1
- package/dist/components/internal/Tooltip.cjs.map +1 -1
- package/dist/components/internal/Tooltip.js +2 -2
- package/dist/components/internal/Tooltip.js.map +1 -1
- package/dist/config.cjs +9 -9
- package/dist/config.cjs.map +1 -1
- package/dist/config.js +8 -8
- package/dist/config.js.map +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +21 -13
- package/dist/index.d.ts +21 -13
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/primitives/AiMessage/index.cjs +14 -76
- package/dist/primitives/AiMessage/index.cjs.map +1 -1
- package/dist/primitives/AiMessage/index.js +13 -75
- package/dist/primitives/AiMessage/index.js.map +1 -1
- package/dist/primitives/AiMessage/tool-invocation.cjs +64 -0
- package/dist/primitives/AiMessage/tool-invocation.cjs.map +1 -0
- package/dist/primitives/AiMessage/tool-invocation.js +62 -0
- package/dist/primitives/AiMessage/tool-invocation.js.map +1 -0
- package/dist/primitives/Comment/index.cjs +5 -4
- package/dist/primitives/Comment/index.cjs.map +1 -1
- package/dist/primitives/Comment/index.js +5 -4
- package/dist/primitives/Comment/index.js.map +1 -1
- package/dist/primitives/Composer/index.cjs +49 -41
- package/dist/primitives/Composer/index.cjs.map +1 -1
- package/dist/primitives/Composer/index.js +50 -42
- package/dist/primitives/Composer/index.js.map +1 -1
- package/dist/primitives/Composer/slate/plugins/mentions.cjs +4 -4
- package/dist/primitives/Composer/slate/plugins/mentions.cjs.map +1 -1
- package/dist/primitives/Composer/slate/plugins/mentions.js +4 -4
- package/dist/primitives/Composer/slate/plugins/mentions.js.map +1 -1
- package/dist/primitives/Composer/utils.cjs +3 -6
- package/dist/primitives/Composer/utils.cjs.map +1 -1
- package/dist/primitives/Composer/utils.js +3 -6
- package/dist/primitives/Composer/utils.js.map +1 -1
- package/dist/primitives/Markdown.cjs +6 -2
- package/dist/primitives/Markdown.cjs.map +1 -1
- package/dist/primitives/Markdown.js +6 -2
- package/dist/primitives/Markdown.js.map +1 -1
- package/dist/primitives/index.d.cts +16 -16
- package/dist/primitives/index.d.ts +16 -16
- package/dist/version.cjs +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/primitives/package.json +2 -2
- package/src/styles/index.css +4 -0
- package/styles.css +1 -1
- package/styles.css.map +1 -1
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { kInternal } from '@liveblocks/core';
|
|
3
|
+
import { useClient } from '@liveblocks/react';
|
|
4
|
+
import { useSignal } from '@liveblocks/react/_private';
|
|
5
|
+
import { useCallback, useMemo } from 'react';
|
|
6
|
+
import { AiToolInvocationContext } from './contexts.js';
|
|
7
|
+
|
|
8
|
+
function StableRenderFn(props) {
|
|
9
|
+
return props.renderFn(props.props);
|
|
10
|
+
}
|
|
11
|
+
function AiMessageToolInvocation({
|
|
12
|
+
message,
|
|
13
|
+
part
|
|
14
|
+
}) {
|
|
15
|
+
const client = useClient();
|
|
16
|
+
const ai = client[kInternal].ai;
|
|
17
|
+
const tool = useSignal(ai.signals.getTool\u03A3(part.name, message.chatId));
|
|
18
|
+
const respond = useCallback(
|
|
19
|
+
(result) => {
|
|
20
|
+
if (part.stage === "receiving") {
|
|
21
|
+
console.log(
|
|
22
|
+
`Ignoring respond(): tool '${part.name}' (${part.invocationId}) is still receiving`
|
|
23
|
+
);
|
|
24
|
+
} else if (part.stage === "executed") {
|
|
25
|
+
console.log(
|
|
26
|
+
`Ignoring respond(): tool '${part.name}' (${part.invocationId}) has already executed`
|
|
27
|
+
);
|
|
28
|
+
} else {
|
|
29
|
+
ai.setToolResult(
|
|
30
|
+
message.chatId,
|
|
31
|
+
message.id,
|
|
32
|
+
part.invocationId,
|
|
33
|
+
result.data
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
[ai, message.chatId, message.id, part.stage, part.name, part.invocationId]
|
|
38
|
+
);
|
|
39
|
+
const props = useMemo(() => {
|
|
40
|
+
const { type: _, ...rest } = part;
|
|
41
|
+
return {
|
|
42
|
+
...rest,
|
|
43
|
+
respond,
|
|
44
|
+
types: void 0,
|
|
45
|
+
[kInternal]: {
|
|
46
|
+
execute: tool?.execute
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
}, [part, respond, tool?.execute]);
|
|
50
|
+
if (tool?.render === void 0)
|
|
51
|
+
return null;
|
|
52
|
+
return /* @__PURE__ */ jsx(AiToolInvocationContext.Provider, {
|
|
53
|
+
value: props,
|
|
54
|
+
children: /* @__PURE__ */ jsx(StableRenderFn, {
|
|
55
|
+
renderFn: tool.render,
|
|
56
|
+
props
|
|
57
|
+
})
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
export { AiMessageToolInvocation };
|
|
62
|
+
//# sourceMappingURL=tool-invocation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-invocation.js","sources":["../../../src/primitives/AiMessage/tool-invocation.tsx"],"sourcesContent":["import {\n type AiChatMessage,\n type AiToolInvocationPart,\n type AiToolInvocationProps,\n type JsonObject,\n kInternal,\n type ToolResultData,\n type ToolResultResponse,\n} from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useSignal } from \"@liveblocks/react/_private\";\nimport { type FunctionComponent, useCallback, useMemo } from \"react\";\n\nimport { AiToolInvocationContext } from \"./contexts\";\n\ntype OpaqueAiToolInvocationProps = AiToolInvocationProps<\n JsonObject,\n ToolResultData\n>;\n\nfunction StableRenderFn(props: {\n renderFn: FunctionComponent<OpaqueAiToolInvocationProps>;\n props: OpaqueAiToolInvocationProps;\n}) {\n return props.renderFn(props.props);\n}\n\n/**\n * @internal\n *\n * This could become publicly exposed as <AiMessage.ToolInvocation /> in the future,\n * but because namespace exports can't be marked `@internal`, we're keeping it in its\n * own file for now.\n */\nexport function AiMessageToolInvocation({\n message,\n part,\n}: {\n message: AiChatMessage;\n part: AiToolInvocationPart;\n}) {\n const client = useClient();\n const ai = client[kInternal].ai;\n const tool = useSignal(ai.signals.getToolΣ(part.name, message.chatId));\n\n const respond = useCallback(\n (result: ToolResultResponse) => {\n if (part.stage === \"receiving\") {\n console.log(\n `Ignoring respond(): tool '${part.name}' (${part.invocationId}) is still receiving`\n );\n } else if (part.stage === \"executed\") {\n console.log(\n `Ignoring respond(): tool '${part.name}' (${part.invocationId}) has already executed`\n );\n } else {\n ai.setToolResult(\n message.chatId,\n message.id,\n part.invocationId,\n result.data\n // TODO Pass in AiGenerationOptions here?\n );\n }\n },\n [ai, message.chatId, message.id, part.stage, part.name, part.invocationId]\n );\n\n const props = useMemo(() => {\n const { type: _, ...rest } = part;\n return {\n ...rest,\n respond,\n types: undefined as never,\n [kInternal]: {\n execute: tool?.execute,\n },\n };\n }, [part, respond, tool?.execute]);\n\n if (tool?.render === undefined) return null;\n return (\n <AiToolInvocationContext.Provider value={props}>\n <StableRenderFn\n renderFn={tool.render as FunctionComponent<OpaqueAiToolInvocationProps>}\n props={props}\n />\n </AiToolInvocationContext.Provider>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAoBA,SAAS,eAAe,KAGrB,EAAA;AACD,EAAO,OAAA,KAAA,CAAM,QAAS,CAAA,KAAA,CAAM,KAAK,CAAA,CAAA;AACnC,CAAA;AASO,SAAS,uBAAwB,CAAA;AAAA,EACtC,OAAA;AAAA,EACA,IAAA;AACF,CAGG,EAAA;AACD,EAAA,MAAM,SAAS,SAAU,EAAA,CAAA;AACzB,EAAM,MAAA,EAAA,GAAK,OAAO,SAAW,CAAA,CAAA,EAAA,CAAA;AAC7B,EAAM,MAAA,IAAA,GAAO,UAAU,EAAG,CAAA,OAAA,CAAQ,cAAS,IAAK,CAAA,IAAA,EAAM,OAAQ,CAAA,MAAM,CAAC,CAAA,CAAA;AAErE,EAAA,MAAM,OAAU,GAAA,WAAA;AAAA,IACd,CAAC,MAA+B,KAAA;AAC9B,MAAI,IAAA,IAAA,CAAK,UAAU,WAAa,EAAA;AAC9B,QAAQ,OAAA,CAAA,GAAA;AAAA,UACN,CAAA,0BAAA,EAA6B,IAAK,CAAA,IAAA,CAAA,GAAA,EAAU,IAAK,CAAA,YAAA,CAAA,oBAAA,CAAA;AAAA,SACnD,CAAA;AAAA,OACF,MAAA,IAAW,IAAK,CAAA,KAAA,KAAU,UAAY,EAAA;AACpC,QAAQ,OAAA,CAAA,GAAA;AAAA,UACN,CAAA,0BAAA,EAA6B,IAAK,CAAA,IAAA,CAAA,GAAA,EAAU,IAAK,CAAA,YAAA,CAAA,sBAAA,CAAA;AAAA,SACnD,CAAA;AAAA,OACK,MAAA;AACL,QAAG,EAAA,CAAA,aAAA;AAAA,UACD,OAAQ,CAAA,MAAA;AAAA,UACR,OAAQ,CAAA,EAAA;AAAA,UACR,IAAK,CAAA,YAAA;AAAA,UACL,MAAO,CAAA,IAAA;AAAA,SAET,CAAA;AAAA,OACF;AAAA,KACF;AAAA,IACA,CAAC,EAAI,EAAA,OAAA,CAAQ,MAAQ,EAAA,OAAA,CAAQ,EAAI,EAAA,IAAA,CAAK,KAAO,EAAA,IAAA,CAAK,IAAM,EAAA,IAAA,CAAK,YAAY,CAAA;AAAA,GAC3E,CAAA;AAEA,EAAM,MAAA,KAAA,GAAQ,QAAQ,MAAM;AAC1B,IAAA,MAAM,EAAE,IAAA,EAAM,CAAM,EAAA,GAAA,IAAA,EAAS,GAAA,IAAA,CAAA;AAC7B,IAAO,OAAA;AAAA,MACL,GAAG,IAAA;AAAA,MACH,OAAA;AAAA,MACA,KAAO,EAAA,KAAA,CAAA;AAAA,MACP,CAAC,SAAY,GAAA;AAAA,QACX,SAAS,IAAM,EAAA,OAAA;AAAA,OACjB;AAAA,KACF,CAAA;AAAA,KACC,CAAC,IAAA,EAAM,OAAS,EAAA,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA;AAEjC,EAAA,IAAI,MAAM,MAAW,KAAA,KAAA,CAAA;AAAW,IAAO,OAAA,IAAA,CAAA;AACvC,EACE,uBAAA,GAAA,CAAC,wBAAwB,QAAxB,EAAA;AAAA,IAAiC,KAAO,EAAA,KAAA;AAAA,IACvC,QAAC,kBAAA,GAAA,CAAA,cAAA,EAAA;AAAA,MACC,UAAU,IAAK,CAAA,MAAA;AAAA,MACf,KAAA;AAAA,KACF,CAAA;AAAA,GACF,CAAA,CAAA;AAEJ;;;;"}
|
|
@@ -32,11 +32,11 @@ const CommentLink = react.forwardRef(
|
|
|
32
32
|
}
|
|
33
33
|
);
|
|
34
34
|
const defaultBodyComponents = {
|
|
35
|
-
Mention: ({
|
|
35
|
+
Mention: ({ mention }) => {
|
|
36
36
|
return /* @__PURE__ */ jsxRuntime.jsxs(CommentMention, {
|
|
37
37
|
children: [
|
|
38
38
|
constants.MENTION_CHARACTER,
|
|
39
|
-
|
|
39
|
+
mention.id
|
|
40
40
|
]
|
|
41
41
|
});
|
|
42
42
|
},
|
|
@@ -68,8 +68,9 @@ const CommentBody = react.forwardRef(
|
|
|
68
68
|
style: { minHeight: "1lh" },
|
|
69
69
|
children: block.children.map((inline, index2) => {
|
|
70
70
|
if (utils.isCommentBodyMention(inline)) {
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
const { type: _, ...mention } = inline;
|
|
72
|
+
return mention.id ? /* @__PURE__ */ jsxRuntime.jsx(Mention, {
|
|
73
|
+
mention
|
|
73
74
|
}, index2) : null;
|
|
74
75
|
}
|
|
75
76
|
if (utils.isCommentBodyLink(inline)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../../../src/primitives/Comment/index.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { MENTION_CHARACTER } from \"../../constants\";\nimport type {\n CommentBodyComponents,\n CommentBodyProps,\n CommentLinkProps,\n CommentMentionProps,\n} from \"./types\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n toAbsoluteUrl,\n} from \"./utils\";\n\nconst COMMENT_MENTION_NAME = \"CommentMention\";\nconst COMMENT_BODY_NAME = \"CommentBody\";\nconst COMMENT_LINK_NAME = \"CommentLink\";\n\n/**\n * Displays mentions within `Comment.Body`.\n *\n * @example\n * <Comment.Mention>@{
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../src/primitives/Comment/index.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { MENTION_CHARACTER } from \"../../constants\";\nimport type {\n CommentBodyComponents,\n CommentBodyProps,\n CommentLinkProps,\n CommentMentionProps,\n} from \"./types\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n toAbsoluteUrl,\n} from \"./utils\";\n\nconst COMMENT_MENTION_NAME = \"CommentMention\";\nconst COMMENT_BODY_NAME = \"CommentBody\";\nconst COMMENT_LINK_NAME = \"CommentLink\";\n\n/**\n * Displays mentions within `Comment.Body`.\n *\n * @example\n * <Comment.Mention>@{mention.id}</Comment.Mention>\n */\nconst CommentMention = forwardRef<HTMLSpanElement, CommentMentionProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"span\";\n\n return (\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n);\n\n/**\n * Displays links within `Comment.Body`.\n *\n * @example\n * <Comment.Link href={href}>{children}</Comment.Link>\n */\nconst CommentLink = forwardRef<HTMLAnchorElement, CommentLinkProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"a\";\n\n return (\n <Component\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n }\n);\n\nconst defaultBodyComponents: CommentBodyComponents = {\n Mention: ({ mention }) => {\n return (\n <CommentMention>\n {MENTION_CHARACTER}\n {mention.id}\n </CommentMention>\n );\n },\n Link: ({ href, children }) => {\n return <CommentLink href={href}>{children}</CommentLink>;\n },\n};\n\n/**\n * Displays a comment body.\n *\n * @example\n * <Comment.Body body={comment.body} />\n */\nconst CommentBody = forwardRef<HTMLDivElement, CommentBodyProps>(\n ({ body, components, style, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const { Mention, Link } = useMemo(\n () => ({ ...defaultBodyComponents, ...components }),\n [components]\n );\n\n if (!body || !body?.content) {\n return null;\n }\n\n return (\n <Component\n {...props}\n style={{ whiteSpace: \"break-spaces\", ...style }}\n ref={forwardedRef}\n >\n {body.content.map((block, index) => {\n switch (block.type) {\n case \"paragraph\":\n return (\n <p key={index} style={{ minHeight: \"1lh\" }}>\n {block.children.map((inline, index) => {\n if (isCommentBodyMention(inline)) {\n const { type: _, ...mention } = inline;\n\n return mention.id ? (\n <Mention mention={mention} key={index} />\n ) : null;\n }\n\n if (isCommentBodyLink(inline)) {\n const href = toAbsoluteUrl(inline.url) ?? inline.url;\n\n return (\n <Link href={href} key={index}>\n {inline.text ?? inline.url}\n </Link>\n );\n }\n\n // <code><s><em><strong>text</strong></s></em></code>\n let children: ReactNode = inline.text;\n\n if (inline.bold) {\n children = <strong key={index}>{children}</strong>;\n }\n\n if (inline.italic) {\n children = <em key={index}>{children}</em>;\n }\n\n if (inline.strikethrough) {\n children = <s key={index}>{children}</s>;\n }\n\n if (inline.code) {\n children = <code key={index}>{children}</code>;\n }\n\n return <span key={index}>{children}</span>;\n })}\n </p>\n );\n default:\n return null;\n }\n })}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n CommentBody.displayName = COMMENT_BODY_NAME;\n CommentMention.displayName = COMMENT_MENTION_NAME;\n CommentLink.displayName = COMMENT_LINK_NAME;\n}\n\n// NOTE: Every export from this file will be available publicly as Comment.*\nexport { CommentBody as Body, CommentLink as Link, CommentMention as Mention };\n"],"names":["forwardRef","Slot","jsx","jsxs","MENTION_CHARACTER","useMemo","index","isCommentBodyMention","isCommentBodyLink","toAbsoluteUrl"],"mappings":"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"}
|
|
@@ -30,11 +30,11 @@ const CommentLink = forwardRef(
|
|
|
30
30
|
}
|
|
31
31
|
);
|
|
32
32
|
const defaultBodyComponents = {
|
|
33
|
-
Mention: ({
|
|
33
|
+
Mention: ({ mention }) => {
|
|
34
34
|
return /* @__PURE__ */ jsxs(CommentMention, {
|
|
35
35
|
children: [
|
|
36
36
|
MENTION_CHARACTER,
|
|
37
|
-
|
|
37
|
+
mention.id
|
|
38
38
|
]
|
|
39
39
|
});
|
|
40
40
|
},
|
|
@@ -66,8 +66,9 @@ const CommentBody = forwardRef(
|
|
|
66
66
|
style: { minHeight: "1lh" },
|
|
67
67
|
children: block.children.map((inline, index2) => {
|
|
68
68
|
if (isCommentBodyMention(inline)) {
|
|
69
|
-
|
|
70
|
-
|
|
69
|
+
const { type: _, ...mention } = inline;
|
|
70
|
+
return mention.id ? /* @__PURE__ */ jsx(Mention, {
|
|
71
|
+
mention
|
|
71
72
|
}, index2) : null;
|
|
72
73
|
}
|
|
73
74
|
if (isCommentBodyLink(inline)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/primitives/Comment/index.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { MENTION_CHARACTER } from \"../../constants\";\nimport type {\n CommentBodyComponents,\n CommentBodyProps,\n CommentLinkProps,\n CommentMentionProps,\n} from \"./types\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n toAbsoluteUrl,\n} from \"./utils\";\n\nconst COMMENT_MENTION_NAME = \"CommentMention\";\nconst COMMENT_BODY_NAME = \"CommentBody\";\nconst COMMENT_LINK_NAME = \"CommentLink\";\n\n/**\n * Displays mentions within `Comment.Body`.\n *\n * @example\n * <Comment.Mention>@{
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../src/primitives/Comment/index.tsx"],"sourcesContent":["import { Slot } from \"@radix-ui/react-slot\";\nimport type { ReactNode } from \"react\";\nimport { forwardRef, useMemo } from \"react\";\n\nimport { MENTION_CHARACTER } from \"../../constants\";\nimport type {\n CommentBodyComponents,\n CommentBodyProps,\n CommentLinkProps,\n CommentMentionProps,\n} from \"./types\";\nimport {\n isCommentBodyLink,\n isCommentBodyMention,\n toAbsoluteUrl,\n} from \"./utils\";\n\nconst COMMENT_MENTION_NAME = \"CommentMention\";\nconst COMMENT_BODY_NAME = \"CommentBody\";\nconst COMMENT_LINK_NAME = \"CommentLink\";\n\n/**\n * Displays mentions within `Comment.Body`.\n *\n * @example\n * <Comment.Mention>@{mention.id}</Comment.Mention>\n */\nconst CommentMention = forwardRef<HTMLSpanElement, CommentMentionProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"span\";\n\n return (\n <Component {...props} ref={forwardedRef}>\n {children}\n </Component>\n );\n }\n);\n\n/**\n * Displays links within `Comment.Body`.\n *\n * @example\n * <Comment.Link href={href}>{children}</Comment.Link>\n */\nconst CommentLink = forwardRef<HTMLAnchorElement, CommentLinkProps>(\n ({ children, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"a\";\n\n return (\n <Component\n target=\"_blank\"\n rel=\"noopener noreferrer nofollow\"\n {...props}\n ref={forwardedRef}\n >\n {children}\n </Component>\n );\n }\n);\n\nconst defaultBodyComponents: CommentBodyComponents = {\n Mention: ({ mention }) => {\n return (\n <CommentMention>\n {MENTION_CHARACTER}\n {mention.id}\n </CommentMention>\n );\n },\n Link: ({ href, children }) => {\n return <CommentLink href={href}>{children}</CommentLink>;\n },\n};\n\n/**\n * Displays a comment body.\n *\n * @example\n * <Comment.Body body={comment.body} />\n */\nconst CommentBody = forwardRef<HTMLDivElement, CommentBodyProps>(\n ({ body, components, style, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"div\";\n const { Mention, Link } = useMemo(\n () => ({ ...defaultBodyComponents, ...components }),\n [components]\n );\n\n if (!body || !body?.content) {\n return null;\n }\n\n return (\n <Component\n {...props}\n style={{ whiteSpace: \"break-spaces\", ...style }}\n ref={forwardedRef}\n >\n {body.content.map((block, index) => {\n switch (block.type) {\n case \"paragraph\":\n return (\n <p key={index} style={{ minHeight: \"1lh\" }}>\n {block.children.map((inline, index) => {\n if (isCommentBodyMention(inline)) {\n const { type: _, ...mention } = inline;\n\n return mention.id ? (\n <Mention mention={mention} key={index} />\n ) : null;\n }\n\n if (isCommentBodyLink(inline)) {\n const href = toAbsoluteUrl(inline.url) ?? inline.url;\n\n return (\n <Link href={href} key={index}>\n {inline.text ?? inline.url}\n </Link>\n );\n }\n\n // <code><s><em><strong>text</strong></s></em></code>\n let children: ReactNode = inline.text;\n\n if (inline.bold) {\n children = <strong key={index}>{children}</strong>;\n }\n\n if (inline.italic) {\n children = <em key={index}>{children}</em>;\n }\n\n if (inline.strikethrough) {\n children = <s key={index}>{children}</s>;\n }\n\n if (inline.code) {\n children = <code key={index}>{children}</code>;\n }\n\n return <span key={index}>{children}</span>;\n })}\n </p>\n );\n default:\n return null;\n }\n })}\n </Component>\n );\n }\n);\n\nif (process.env.NODE_ENV !== \"production\") {\n CommentBody.displayName = COMMENT_BODY_NAME;\n CommentMention.displayName = COMMENT_MENTION_NAME;\n CommentLink.displayName = COMMENT_LINK_NAME;\n}\n\n// NOTE: Every export from this file will be available publicly as Comment.*\nexport { CommentBody as Body, CommentLink as Link, CommentMention as Mention };\n"],"names":["index"],"mappings":"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"}
|
|
@@ -101,11 +101,12 @@ function ComposerEditorMentionWrapper({
|
|
|
101
101
|
element
|
|
102
102
|
}) {
|
|
103
103
|
const isSelected = slateReact.useSelected();
|
|
104
|
+
const { children: _, ...mention } = element;
|
|
104
105
|
return /* @__PURE__ */ jsxRuntime.jsxs("span", {
|
|
105
106
|
...attributes,
|
|
106
107
|
children: [
|
|
107
108
|
element.id ? /* @__PURE__ */ jsxRuntime.jsx(Mention, {
|
|
108
|
-
|
|
109
|
+
mention,
|
|
109
110
|
isSelected
|
|
110
111
|
}) : null,
|
|
111
112
|
children
|
|
@@ -133,9 +134,9 @@ function ComposerEditorLinkWrapper({
|
|
|
133
134
|
function ComposerEditorMentionSuggestionsWrapper({
|
|
134
135
|
id,
|
|
135
136
|
itemId,
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
mentions: mentions$1,
|
|
138
|
+
selectedMentionId,
|
|
139
|
+
setSelectedMentionId,
|
|
139
140
|
mentionDraft,
|
|
140
141
|
setMentionDraft,
|
|
141
142
|
onItemSelect,
|
|
@@ -146,9 +147,9 @@ function ComposerEditorMentionSuggestionsWrapper({
|
|
|
146
147
|
const editor = slateReact.useSlateStatic();
|
|
147
148
|
const { onEditorChange } = contexts.useComposerEditorContext();
|
|
148
149
|
const { isFocused } = contexts.useComposer();
|
|
149
|
-
const { portalContainer } = config.
|
|
150
|
+
const { portalContainer } = config.useLiveblocksUiConfig();
|
|
150
151
|
const [contentRef, contentZIndex] = utils$1.useContentZIndex();
|
|
151
|
-
const isOpen = isFocused && mentionDraft?.range !== void 0 &&
|
|
152
|
+
const isOpen = isFocused && mentionDraft?.range !== void 0 && mentions$1 !== void 0;
|
|
152
153
|
const {
|
|
153
154
|
refs: { setReference, setFloating },
|
|
154
155
|
strategy,
|
|
@@ -192,14 +193,14 @@ function ComposerEditorMentionSuggestionsWrapper({
|
|
|
192
193
|
return () => {
|
|
193
194
|
cancelAnimationFrame(animationFrame);
|
|
194
195
|
};
|
|
195
|
-
}, [
|
|
196
|
+
}, [mentions$1?.length, isOpen, elements.floating, update]);
|
|
196
197
|
return /* @__PURE__ */ jsxRuntime.jsx(Persist.Persist, {
|
|
197
198
|
children: isOpen ? /* @__PURE__ */ jsxRuntime.jsx(contexts.ComposerSuggestionsContext.Provider, {
|
|
198
199
|
value: {
|
|
199
200
|
id,
|
|
200
201
|
itemId,
|
|
201
|
-
selectedValue:
|
|
202
|
-
setSelectedValue:
|
|
202
|
+
selectedValue: selectedMentionId,
|
|
203
|
+
setSelectedValue: setSelectedMentionId,
|
|
203
204
|
onItemSelect,
|
|
204
205
|
placement,
|
|
205
206
|
dir,
|
|
@@ -217,8 +218,8 @@ function ComposerEditorMentionSuggestionsWrapper({
|
|
|
217
218
|
zIndex: contentZIndex
|
|
218
219
|
},
|
|
219
220
|
children: /* @__PURE__ */ jsxRuntime.jsx(MentionSuggestions, {
|
|
220
|
-
|
|
221
|
-
|
|
221
|
+
mentions: mentions$1,
|
|
222
|
+
selectedMentionId
|
|
222
223
|
})
|
|
223
224
|
})
|
|
224
225
|
}) : null
|
|
@@ -235,7 +236,7 @@ function ComposerEditorFloatingToolbarWrapper({
|
|
|
235
236
|
const editor = slateReact.useSlateStatic();
|
|
236
237
|
const { onEditorChange } = contexts.useComposerEditorContext();
|
|
237
238
|
const { isFocused } = contexts.useComposer();
|
|
238
|
-
const { portalContainer } = config.
|
|
239
|
+
const { portalContainer } = config.useLiveblocksUiConfig();
|
|
239
240
|
const [contentRef, contentZIndex] = utils$1.useContentZIndex();
|
|
240
241
|
const [isPointerDown, setPointerDown] = react.useState(false);
|
|
241
242
|
const isOpen = isFocused && !isPointerDown && hasFloatingToolbarRange;
|
|
@@ -561,21 +562,21 @@ const defaultEditorComponents = {
|
|
|
561
562
|
children
|
|
562
563
|
});
|
|
563
564
|
},
|
|
564
|
-
Mention: ({
|
|
565
|
+
Mention: ({ mention }) => {
|
|
565
566
|
return /* @__PURE__ */ jsxRuntime.jsxs(ComposerMention, {
|
|
566
567
|
children: [
|
|
567
568
|
constants.MENTION_CHARACTER,
|
|
568
|
-
|
|
569
|
+
mention.id
|
|
569
570
|
]
|
|
570
571
|
});
|
|
571
572
|
},
|
|
572
|
-
MentionSuggestions: ({
|
|
573
|
-
return
|
|
573
|
+
MentionSuggestions: ({ mentions }) => {
|
|
574
|
+
return mentions.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(ComposerSuggestions, {
|
|
574
575
|
children: /* @__PURE__ */ jsxRuntime.jsx(ComposerSuggestionsList, {
|
|
575
|
-
children:
|
|
576
|
-
value:
|
|
577
|
-
children:
|
|
578
|
-
},
|
|
576
|
+
children: mentions.map((mention) => /* @__PURE__ */ jsxRuntime.jsx(ComposerSuggestionsListItem, {
|
|
577
|
+
value: mention.id,
|
|
578
|
+
children: mention.id
|
|
579
|
+
}, mention.id))
|
|
579
580
|
})
|
|
580
581
|
}) : null;
|
|
581
582
|
}
|
|
@@ -630,7 +631,7 @@ const ComposerEditor = react.forwardRef(
|
|
|
630
631
|
const floatingToolbarId = `liveblocks-floating-toolbar-${id}`;
|
|
631
632
|
const suggestionsListId = `liveblocks-suggestions-list-${id}`;
|
|
632
633
|
const suggestionsListItemId = react.useCallback(
|
|
633
|
-
(
|
|
634
|
+
(mentionId) => mentionId ? `liveblocks-suggestions-list-item-${id}-${mentionId}` : void 0,
|
|
634
635
|
[id]
|
|
635
636
|
);
|
|
636
637
|
const renderElement = react.useCallback(
|
|
@@ -651,12 +652,12 @@ const ComposerEditor = react.forwardRef(
|
|
|
651
652
|
[validate, onEditorChange]
|
|
652
653
|
);
|
|
653
654
|
const createMention = react.useCallback(
|
|
654
|
-
(
|
|
655
|
-
if (!mentionDraft || !
|
|
655
|
+
(mention) => {
|
|
656
|
+
if (!mentionDraft || !mention) {
|
|
656
657
|
return;
|
|
657
658
|
}
|
|
658
659
|
slate.Transforms.select(editor, mentionDraft.range);
|
|
659
|
-
mentions.insertMention(editor,
|
|
660
|
+
mentions.insertMention(editor, mention);
|
|
660
661
|
setMentionDraft(void 0);
|
|
661
662
|
setSelectedMentionSuggestionIndex(0);
|
|
662
663
|
},
|
|
@@ -685,8 +686,8 @@ const ComposerEditor = react.forwardRef(
|
|
|
685
686
|
}
|
|
686
687
|
if (isKey.isKey(event, "Enter") || isKey.isKey(event, "Tab")) {
|
|
687
688
|
event.preventDefault();
|
|
688
|
-
const
|
|
689
|
-
createMention(
|
|
689
|
+
const mention = mentionSuggestions?.[selectedMentionSuggestionIndex];
|
|
690
|
+
createMention(mention);
|
|
690
691
|
}
|
|
691
692
|
if (isKey.isKey(event, "Escape")) {
|
|
692
693
|
event.preventDefault();
|
|
@@ -765,13 +766,13 @@ const ComposerEditor = react.forwardRef(
|
|
|
765
766
|
},
|
|
766
767
|
[onBlur, setFocused]
|
|
767
768
|
);
|
|
768
|
-
const
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
769
|
+
const selectedMention = mentionSuggestions?.[selectedMentionSuggestionIndex];
|
|
770
|
+
const selectedMentionId = selectedMention?.id;
|
|
771
|
+
const setSelectedMentionId = react.useCallback(
|
|
772
|
+
(mentionId) => {
|
|
773
|
+
const index = mentionSuggestions?.findIndex(
|
|
774
|
+
(mention) => mention.id === mentionId
|
|
775
|
+
);
|
|
775
776
|
if (index !== void 0 && index >= 0) {
|
|
776
777
|
setSelectedMentionSuggestionIndex(index);
|
|
777
778
|
}
|
|
@@ -784,9 +785,7 @@ const ComposerEditor = react.forwardRef(
|
|
|
784
785
|
"aria-autocomplete": "list",
|
|
785
786
|
"aria-expanded": true,
|
|
786
787
|
"aria-controls": suggestionsListId,
|
|
787
|
-
"aria-activedescendant": suggestionsListItemId(
|
|
788
|
-
selectedMentionSuggestionUserId
|
|
789
|
-
)
|
|
788
|
+
"aria-activedescendant": suggestionsListItemId(selectedMentionId)
|
|
790
789
|
} : hasFloatingToolbarRange ? {
|
|
791
790
|
"aria-haspopup": true,
|
|
792
791
|
"aria-controls": floatingToolbarId
|
|
@@ -795,7 +794,7 @@ const ComposerEditor = react.forwardRef(
|
|
|
795
794
|
mentionDraft,
|
|
796
795
|
suggestionsListId,
|
|
797
796
|
suggestionsListItemId,
|
|
798
|
-
|
|
797
|
+
selectedMentionId,
|
|
799
798
|
hasFloatingToolbarRange,
|
|
800
799
|
floatingToolbarId
|
|
801
800
|
]
|
|
@@ -813,6 +812,15 @@ const ComposerEditor = react.forwardRef(
|
|
|
813
812
|
select();
|
|
814
813
|
}
|
|
815
814
|
}, [editor, select, isFocused]);
|
|
815
|
+
const handleMentionSelect = react.useCallback(
|
|
816
|
+
(mentionId) => {
|
|
817
|
+
const mention = mentionSuggestions?.find(
|
|
818
|
+
(mention2) => mention2.id === mentionId
|
|
819
|
+
);
|
|
820
|
+
createMention(mention);
|
|
821
|
+
},
|
|
822
|
+
[createMention, mentionSuggestions]
|
|
823
|
+
);
|
|
816
824
|
return /* @__PURE__ */ jsxRuntime.jsxs(slateReact.Slate, {
|
|
817
825
|
editor,
|
|
818
826
|
initialValue: initialEditorValue,
|
|
@@ -840,12 +848,12 @@ const ComposerEditor = react.forwardRef(
|
|
|
840
848
|
dir,
|
|
841
849
|
mentionDraft,
|
|
842
850
|
setMentionDraft,
|
|
843
|
-
|
|
844
|
-
|
|
845
|
-
|
|
851
|
+
selectedMentionId,
|
|
852
|
+
setSelectedMentionId,
|
|
853
|
+
mentions: mentionSuggestions,
|
|
846
854
|
id: suggestionsListId,
|
|
847
855
|
itemId: suggestionsListItemId,
|
|
848
|
-
onItemSelect:
|
|
856
|
+
onItemSelect: handleMentionSelect,
|
|
849
857
|
MentionSuggestions
|
|
850
858
|
}),
|
|
851
859
|
FloatingToolbar && /* @__PURE__ */ jsxRuntime.jsx(ComposerEditorFloatingToolbarWrapper, {
|