@liveblocks/react-ui 3.2.0 → 3.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/dist/_private/index.cjs +4 -2
  2. package/dist/_private/index.cjs.map +1 -1
  3. package/dist/_private/index.d.cts +111 -38
  4. package/dist/_private/index.d.ts +111 -38
  5. package/dist/_private/index.js +3 -2
  6. package/dist/_private/index.js.map +1 -1
  7. package/dist/components/AiChat.cjs +11 -9
  8. package/dist/components/AiChat.cjs.map +1 -1
  9. package/dist/components/AiChat.js +12 -10
  10. package/dist/components/AiChat.js.map +1 -1
  11. package/dist/components/Thread.cjs +58 -0
  12. package/dist/components/Thread.cjs.map +1 -1
  13. package/dist/components/Thread.js +59 -1
  14. package/dist/components/Thread.js.map +1 -1
  15. package/dist/components/internal/AiComposer.cjs +132 -0
  16. package/dist/components/internal/AiComposer.cjs.map +1 -0
  17. package/dist/components/internal/AiComposer.js +130 -0
  18. package/dist/components/internal/AiComposer.js.map +1 -0
  19. package/dist/components/internal/Button.cjs.map +1 -1
  20. package/dist/components/internal/Button.js.map +1 -1
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +123 -15
  23. package/dist/index.d.ts +123 -15
  24. package/dist/index.js.map +1 -1
  25. package/dist/overrides.cjs +4 -3
  26. package/dist/overrides.cjs.map +1 -1
  27. package/dist/overrides.js +4 -3
  28. package/dist/overrides.js.map +1 -1
  29. package/dist/primitives/AiComposer/contexts.cjs +24 -0
  30. package/dist/primitives/AiComposer/contexts.cjs.map +1 -0
  31. package/dist/primitives/AiComposer/contexts.js +19 -0
  32. package/dist/primitives/AiComposer/contexts.js.map +1 -0
  33. package/dist/primitives/AiComposer/index.cjs +348 -0
  34. package/dist/primitives/AiComposer/index.cjs.map +1 -0
  35. package/dist/primitives/AiComposer/index.js +340 -0
  36. package/dist/primitives/AiComposer/index.js.map +1 -0
  37. package/dist/primitives/Markdown.cjs +4 -3
  38. package/dist/primitives/Markdown.cjs.map +1 -1
  39. package/dist/primitives/Markdown.js +4 -3
  40. package/dist/primitives/Markdown.js.map +1 -1
  41. package/dist/primitives/index.d.cts +8 -1
  42. package/dist/primitives/index.d.ts +8 -1
  43. package/dist/version.cjs +1 -1
  44. package/dist/version.js +1 -1
  45. package/package.json +4 -4
  46. package/src/styles/index.css +37 -11
  47. package/styles.css +1 -1
  48. package/styles.css.map +1 -1
  49. package/dist/components/internal/AiChatComposer.cjs +0 -161
  50. package/dist/components/internal/AiChatComposer.cjs.map +0 -1
  51. package/dist/components/internal/AiChatComposer.js +0 -159
  52. package/dist/components/internal/AiChatComposer.js.map +0 -1
  53. package/dist/primitives/AiChatComposer/index.cjs +0 -202
  54. package/dist/primitives/AiChatComposer/index.cjs.map +0 -1
  55. package/dist/primitives/AiChatComposer/index.js +0 -195
  56. package/dist/primitives/AiChatComposer/index.js.map +0 -1
@@ -0,0 +1,19 @@
1
+ import { nn } from '@liveblocks/core';
2
+ import { createContext, useContext } from 'react';
3
+
4
+ const AiComposerContext = createContext(null);
5
+ const AiComposerEditorContext = createContext(null);
6
+ function useAiComposerEditorContext() {
7
+ const composerEditorContext = useContext(AiComposerEditorContext);
8
+ return nn(
9
+ composerEditorContext,
10
+ "AiComposer.Form is missing from the React tree."
11
+ );
12
+ }
13
+ function useAiComposer() {
14
+ const composerContext = useContext(AiComposerContext);
15
+ return nn(composerContext, "AiComposer.Form is missing from the React tree.");
16
+ }
17
+
18
+ export { AiComposerContext, AiComposerEditorContext, useAiComposer, useAiComposerEditorContext };
19
+ //# sourceMappingURL=contexts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"contexts.js","sources":["../../../src/primitives/AiComposer/contexts.ts"],"sourcesContent":["import { type MessageId, nn } from \"@liveblocks/core\";\nimport {\n createContext,\n type Dispatch,\n type SetStateAction,\n useContext,\n} from \"react\";\nimport type {\n Descendant as SlateDescendant,\n Editor as SlateEditor,\n} from \"slate\";\n\nexport type AiComposerContext = {\n /**\n * Whether the composer is currently disabled.\n */\n isDisabled: boolean;\n\n /**\n * Whether the composer can currently be submitted.\n */\n canSubmit: boolean;\n\n /**\n * Whether the composer can currently abort a response in its related chat.\n */\n canAbort: boolean;\n\n /**\n * Whether the editor is currently focused.\n */\n isFocused: boolean;\n\n /**\n * Whether the editor is currently empty.\n */\n isEmpty: boolean;\n\n /**\n * Submit the composer programmatically.\n */\n submit: () => void;\n\n /**\n * Abort the composer's related response programmatically.\n */\n abort: () => void;\n\n /**\n * Clear the composer programmatically.\n */\n clear: () => void;\n\n /**\n * Select the editor programmatically.\n */\n select: () => void;\n\n /**\n * Focus the editor programmatically.\n */\n focus: () => void;\n\n /**\n * Blur the editor programmatically.\n */\n blur: () => void;\n};\n\nexport type AiComposerEditorContext = {\n onEditorValueChange: (value: SlateDescendant[]) => void;\n editor: SlateEditor;\n abortableMessageId: MessageId | undefined;\n setFocused: Dispatch<SetStateAction<boolean>>;\n};\n\nexport const AiComposerContext = createContext<AiComposerContext | null>(null);\nexport const AiComposerEditorContext =\n createContext<AiComposerEditorContext | null>(null);\n\nexport function useAiComposerEditorContext() {\n const composerEditorContext = useContext(AiComposerEditorContext);\n\n return nn(\n composerEditorContext,\n \"AiComposer.Form is missing from the React tree.\"\n );\n}\n\nexport function useAiComposer(): AiComposerContext {\n const composerContext = useContext(AiComposerContext);\n\n return nn(composerContext, \"AiComposer.Form is missing from the React tree.\");\n}\n"],"names":[],"mappings":";;;AA4Ea,MAAA,iBAAA,GAAoB,cAAwC,IAAI,EAAA;AAChE,MAAA,uBAAA,GACX,cAA8C,IAAI,EAAA;AAE7C,SAAS,0BAA6B,GAAA;AAC3C,EAAM,MAAA,qBAAA,GAAwB,WAAW,uBAAuB,CAAA,CAAA;AAEhE,EAAO,OAAA,EAAA;AAAA,IACL,qBAAA;AAAA,IACA,iDAAA;AAAA,GACF,CAAA;AACF,CAAA;AAEO,SAAS,aAAmC,GAAA;AACjD,EAAM,MAAA,eAAA,GAAkB,WAAW,iBAAiB,CAAA,CAAA;AAEpD,EAAO,OAAA,EAAA,CAAG,iBAAiB,iDAAiD,CAAA,CAAA;AAC9E;;;;"}
@@ -0,0 +1,348 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var core = require('@liveblocks/core');
5
+ var react$1 = require('@liveblocks/react');
6
+ var _private = require('@liveblocks/react/_private');
7
+ var reactSlot = require('@radix-ui/react-slot');
8
+ var react = require('react');
9
+ var slate = require('slate');
10
+ var slateHistory = require('slate-history');
11
+ var slateReact = require('slate-react');
12
+ var requestSubmit = require('../../utils/request-submit.cjs');
13
+ var useInitial = require('../../utils/use-initial.cjs');
14
+ var normalize = require('../slate/plugins/normalize.cjs');
15
+ var isEmpty = require('../slate/utils/is-empty.cjs');
16
+ var contexts = require('./contexts.cjs');
17
+
18
+ const AI_COMPOSER_SUBMIT_NAME = "AiComposerSubmit";
19
+ const AI_COMPOSER_ABORT_NAME = "AiComposerAbort";
20
+ const AI_COMPOSER_EDITOR_NAME = "AiComposerEditor";
21
+ const AI_COMPOSER_FORM_NAME = "AiComposerForm";
22
+ const emptyMessages\u03A3 = new core.Signal([]);
23
+ function getLastMessageId(messages) {
24
+ const lastMessage = messages[messages.length - 1];
25
+ if (lastMessage === void 0) {
26
+ return null;
27
+ }
28
+ return lastMessage.id;
29
+ }
30
+ function getAbortableMessageId(messages) {
31
+ return messages.find(
32
+ (message) => message.role === "assistant" && (message.status === "generating" || message.status === "awaiting-tool")
33
+ )?.id;
34
+ }
35
+ const AiComposerForm = react.forwardRef(
36
+ ({
37
+ onComposerSubmit,
38
+ onSubmit,
39
+ disabled,
40
+ chatId,
41
+ branchId,
42
+ asChild,
43
+ ...props
44
+ }, forwardedRef) => {
45
+ const Component = asChild ? reactSlot.Slot : "form";
46
+ const client = react$1.useClient();
47
+ const formRef = react.useRef(null);
48
+ const editor = useInitial.useInitial(
49
+ () => normalize.withNormalize(slateHistory.withHistory(slateReact.withReact(slate.createEditor())))
50
+ );
51
+ const [isEditorEmpty, setEditorEmpty] = react.useState(true);
52
+ const [isSubmitting, setSubmitting] = react.useState(false);
53
+ const [isFocused, setFocused] = react.useState(false);
54
+ const messages\u03A3 = chatId ? client[core.kInternal].ai.signals.getChatMessagesForBranch\u03A3(chatId, branchId) : emptyMessages\u03A3;
55
+ const lastMessageId = _private.useSignal(messages\u03A3, getLastMessageId);
56
+ const abortableMessageId = _private.useSignal(messages\u03A3, getAbortableMessageId);
57
+ const isDisabled = isSubmitting || disabled === true;
58
+ const canAbort = abortableMessageId !== void 0;
59
+ const canSubmit = !isEditorEmpty && !canAbort;
60
+ const clear = react.useCallback(() => {
61
+ slate.Transforms.delete(editor, {
62
+ at: {
63
+ anchor: slate.Editor.start(editor, []),
64
+ focus: slate.Editor.end(editor, [])
65
+ }
66
+ });
67
+ }, [editor]);
68
+ const select = react.useCallback(() => {
69
+ slate.Transforms.select(editor, slate.Editor.end(editor, []));
70
+ }, [editor]);
71
+ const focus = react.useCallback(
72
+ (resetSelection = true) => {
73
+ try {
74
+ if (!slateReact.ReactEditor.isFocused(editor)) {
75
+ slate.Transforms.select(
76
+ editor,
77
+ resetSelection || !editor.selection ? slate.Editor.end(editor, []) : editor.selection
78
+ );
79
+ slateReact.ReactEditor.focus(editor);
80
+ }
81
+ } catch {
82
+ }
83
+ },
84
+ [editor]
85
+ );
86
+ const blur = react.useCallback(() => {
87
+ try {
88
+ slateReact.ReactEditor.blur(editor);
89
+ } catch {
90
+ }
91
+ }, [editor]);
92
+ const onSubmitEnd = react.useCallback(() => {
93
+ clear();
94
+ setSubmitting(false);
95
+ }, [clear]);
96
+ const handleSubmit = react.useCallback(
97
+ (event) => {
98
+ if (disabled) {
99
+ return;
100
+ }
101
+ const isEditorEmpty2 = isEmpty.isEmpty(editor, editor.children);
102
+ if (isEditorEmpty2) {
103
+ event.preventDefault();
104
+ return;
105
+ }
106
+ onSubmit?.(event);
107
+ if (onComposerSubmit === void 0 || event.isDefaultPrevented()) {
108
+ event.preventDefault();
109
+ return;
110
+ }
111
+ const content = editor.children.map((block) => {
112
+ if ("type" in block && block.type === "paragraph") {
113
+ return block.children.map((child) => {
114
+ if ("text" in child) {
115
+ return child.text;
116
+ }
117
+ return "";
118
+ }).join("");
119
+ }
120
+ return "";
121
+ }).join("\n");
122
+ const promise = onComposerSubmit(
123
+ { text: content, lastMessageId },
124
+ event
125
+ );
126
+ event.preventDefault();
127
+ if (promise) {
128
+ setSubmitting(true);
129
+ promise.then(onSubmitEnd);
130
+ } else {
131
+ onSubmitEnd();
132
+ }
133
+ },
134
+ [disabled, editor, onSubmit, onComposerSubmit, onSubmitEnd, lastMessageId]
135
+ );
136
+ _private.useLayoutEffect(() => {
137
+ setEditorEmpty(isEmpty.isEmpty(editor, editor.children));
138
+ }, [editor]);
139
+ const handleEditorValueChange = react.useCallback(() => {
140
+ setEditorEmpty(isEmpty.isEmpty(editor, editor.children));
141
+ }, [editor]);
142
+ const submit = react.useCallback(() => {
143
+ if (!canSubmit) {
144
+ return;
145
+ }
146
+ requestAnimationFrame(() => {
147
+ if (formRef.current) {
148
+ requestSubmit.requestSubmit(formRef.current);
149
+ }
150
+ });
151
+ }, [canSubmit]);
152
+ const abort = react.useCallback(() => {
153
+ if (!canAbort || !abortableMessageId) {
154
+ return;
155
+ }
156
+ client[core.kInternal].ai.abort(abortableMessageId);
157
+ }, [canAbort, abortableMessageId, client]);
158
+ react.useImperativeHandle(
159
+ forwardedRef,
160
+ () => formRef.current,
161
+ []
162
+ );
163
+ return /* @__PURE__ */ jsxRuntime.jsx(contexts.AiComposerEditorContext.Provider, {
164
+ value: {
165
+ editor,
166
+ onEditorValueChange: handleEditorValueChange,
167
+ abortableMessageId,
168
+ setFocused
169
+ },
170
+ children: /* @__PURE__ */ jsxRuntime.jsx(contexts.AiComposerContext.Provider, {
171
+ value: {
172
+ isDisabled,
173
+ isEmpty: isEditorEmpty,
174
+ isFocused,
175
+ canSubmit,
176
+ canAbort,
177
+ submit,
178
+ abort,
179
+ clear,
180
+ focus,
181
+ blur,
182
+ select
183
+ },
184
+ children: /* @__PURE__ */ jsxRuntime.jsx(Component, {
185
+ onSubmit: handleSubmit,
186
+ ...props,
187
+ ref: formRef
188
+ })
189
+ })
190
+ });
191
+ }
192
+ );
193
+ function AiComposerEditorPlaceholder({
194
+ attributes,
195
+ children
196
+ }) {
197
+ const { opacity: _opacity, ...style } = attributes.style;
198
+ return /* @__PURE__ */ jsxRuntime.jsx("span", {
199
+ ...attributes,
200
+ style,
201
+ "data-placeholder": "",
202
+ children
203
+ });
204
+ }
205
+ const AiComposerEditor = react.forwardRef(
206
+ ({
207
+ defaultValue = "",
208
+ onKeyDown,
209
+ onFocus,
210
+ onBlur,
211
+ disabled,
212
+ autoFocus,
213
+ dir,
214
+ ...props
215
+ }, forwardedRef) => {
216
+ const { editor, onEditorValueChange, setFocused } = contexts.useAiComposerEditorContext();
217
+ const {
218
+ submit,
219
+ isDisabled: isComposerDisabled,
220
+ isFocused,
221
+ focus,
222
+ blur,
223
+ select
224
+ } = contexts.useAiComposer();
225
+ const isDisabled = disabled || isComposerDisabled;
226
+ const handleKeyDown = react.useCallback(
227
+ (event) => {
228
+ onKeyDown?.(event);
229
+ if (event.isDefaultPrevented())
230
+ return;
231
+ if (event.key === "Enter" && !event.shiftKey) {
232
+ event.preventDefault();
233
+ submit();
234
+ } else if (event.key === "Enter" && event.shiftKey) {
235
+ event.preventDefault();
236
+ editor.insertBreak();
237
+ } else if (event.key === "Escape") {
238
+ blur();
239
+ }
240
+ },
241
+ [editor, onKeyDown, submit, blur]
242
+ );
243
+ const handleFocus = react.useCallback(
244
+ (event) => {
245
+ onFocus?.(event);
246
+ if (!event.isDefaultPrevented()) {
247
+ setFocused(true);
248
+ }
249
+ },
250
+ [onFocus, setFocused]
251
+ );
252
+ const handleBlur = react.useCallback(
253
+ (event) => {
254
+ onBlur?.(event);
255
+ if (!event.isDefaultPrevented()) {
256
+ setFocused(false);
257
+ }
258
+ },
259
+ [onBlur, setFocused]
260
+ );
261
+ react.useImperativeHandle(
262
+ forwardedRef,
263
+ () => slateReact.ReactEditor.toDOMNode(editor, editor),
264
+ [editor]
265
+ );
266
+ _private.useLayoutEffect(() => {
267
+ if (autoFocus) {
268
+ focus();
269
+ }
270
+ }, [autoFocus, editor, focus]);
271
+ _private.useLayoutEffect(() => {
272
+ if (isFocused && editor.selection === null) {
273
+ select();
274
+ }
275
+ }, [editor, select, isFocused]);
276
+ const initialValue = react.useMemo(() => {
277
+ return defaultValue.split("\n").map((text) => ({ type: "paragraph", children: [{ text }] }));
278
+ }, [defaultValue]);
279
+ return /* @__PURE__ */ jsxRuntime.jsx(slateReact.Slate, {
280
+ editor,
281
+ initialValue,
282
+ onValueChange: onEditorValueChange,
283
+ children: /* @__PURE__ */ jsxRuntime.jsx(slateReact.Editable, {
284
+ dir,
285
+ enterKeyHint: "send",
286
+ autoCapitalize: "sentences",
287
+ "aria-label": "Composer editor",
288
+ onKeyDown: handleKeyDown,
289
+ onFocus: handleFocus,
290
+ onBlur: handleBlur,
291
+ "data-focused": isFocused || void 0,
292
+ "data-disabled": isDisabled || void 0,
293
+ ...props,
294
+ readOnly: isDisabled,
295
+ disabled: isDisabled,
296
+ renderPlaceholder: AiComposerEditorPlaceholder
297
+ })
298
+ });
299
+ }
300
+ );
301
+ const AiComposerSubmit = react.forwardRef(({ disabled, asChild, ...props }, forwardedRef) => {
302
+ const Component = asChild ? reactSlot.Slot : "button";
303
+ const { isDisabled: isComposerDisabled, canSubmit } = contexts.useAiComposer();
304
+ const isDisabled = isComposerDisabled || disabled || !canSubmit;
305
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, {
306
+ type: "submit",
307
+ ...props,
308
+ ref: forwardedRef,
309
+ disabled: isDisabled
310
+ });
311
+ });
312
+ const AiComposerAbort = react.forwardRef(({ disabled, onClick, asChild, ...props }, forwardedRef) => {
313
+ const Component = asChild ? reactSlot.Slot : "button";
314
+ const { isDisabled: isComposerDisabled, canAbort, abort } = contexts.useAiComposer();
315
+ const isDisabled = isComposerDisabled || disabled || !canAbort;
316
+ const handleClick = react.useCallback(
317
+ (event) => {
318
+ onClick?.(event);
319
+ if (event.isDefaultPrevented()) {
320
+ return;
321
+ }
322
+ abort();
323
+ },
324
+ [abort, onClick]
325
+ );
326
+ return /* @__PURE__ */ jsxRuntime.jsx(Component, {
327
+ type: "button",
328
+ ...props,
329
+ ref: forwardedRef,
330
+ disabled: isDisabled,
331
+ onClick: handleClick
332
+ });
333
+ });
334
+ if (process.env.NODE_ENV !== "production") {
335
+ AiComposerEditor.displayName = AI_COMPOSER_EDITOR_NAME;
336
+ AiComposerForm.displayName = AI_COMPOSER_FORM_NAME;
337
+ AiComposerSubmit.displayName = AI_COMPOSER_SUBMIT_NAME;
338
+ AiComposerAbort.displayName = AI_COMPOSER_ABORT_NAME;
339
+ }
340
+
341
+ exports.Abort = AiComposerAbort;
342
+ exports.AiComposerAbort = AiComposerAbort;
343
+ exports.AiComposerForm = AiComposerForm;
344
+ exports.AiComposerSubmit = AiComposerSubmit;
345
+ exports.Editor = AiComposerEditor;
346
+ exports.Form = AiComposerForm;
347
+ exports.Submit = AiComposerSubmit;
348
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","sources":["../../../src/primitives/AiComposer/index.tsx"],"sourcesContent":["import {\n type AiChatMessage,\n kInternal,\n Signal,\n type WithNavigation,\n} from \"@liveblocks/core\";\nimport { useClient } from \"@liveblocks/react\";\nimport { useLayoutEffect, useSignal } from \"@liveblocks/react/_private\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport type { FocusEvent, FormEvent, KeyboardEvent, MouseEvent } from \"react\";\nimport {\n forwardRef,\n useCallback,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport {\n createEditor,\n Editor as SlateEditor,\n Transforms as SlateTransforms,\n} from \"slate\";\nimport { withHistory } from \"slate-history\";\nimport {\n Editable,\n ReactEditor,\n type RenderPlaceholderProps,\n Slate,\n withReact,\n} from \"slate-react\";\n\nimport type { AiComposerBody } from \"../../types\";\nimport { requestSubmit } from \"../../utils/request-submit\";\nimport { useInitial } from \"../../utils/use-initial\";\nimport { withNormalize } from \"../slate/plugins/normalize\";\nimport { isEmpty } from \"../slate/utils/is-empty\";\nimport {\n AiComposerContext,\n AiComposerEditorContext,\n useAiComposer,\n useAiComposerEditorContext,\n} from \"./contexts\";\nimport type {\n AiComposerEditorProps,\n AiComposerFormProps,\n AiComposerSubmitProps,\n} from \"./types\";\n\nconst AI_COMPOSER_SUBMIT_NAME = \"AiComposerSubmit\";\nconst AI_COMPOSER_ABORT_NAME = \"AiComposerAbort\";\nconst AI_COMPOSER_EDITOR_NAME = \"AiComposerEditor\";\nconst AI_COMPOSER_FORM_NAME = \"AiComposerForm\";\n\ntype UiChatMessage = WithNavigation<AiChatMessage>;\n\n/* -------------------------------------------------------------------------------------------------\n * Form\n * -----------------------------------------------------------------------------------------------*/\n\nconst emptyMessagesΣ = new Signal<UiChatMessage[]>([]);\n\nfunction getLastMessageId(messages: UiChatMessage[]) {\n const lastMessage = messages[messages.length - 1];\n\n if (lastMessage === undefined) {\n return null;\n }\n\n return lastMessage.id;\n}\n\nfunction getAbortableMessageId(messages: UiChatMessage[]) {\n return messages.find(\n (message) =>\n message.role === \"assistant\" &&\n (message.status === \"generating\" || message.status === \"awaiting-tool\")\n )?.id;\n}\n\n/**\n * Surrounds the AI composer's content and handles submissions.\n *\n * @example\n * <AiComposer.Form onComposerSubmit={({ text }) => {}}>\n *\t <AiComposer.Editor />\n * <AiComposer.Submit />\n * </AiComposer.Form>\n */\nexport const AiComposerForm = forwardRef<HTMLFormElement, AiComposerFormProps>(\n (\n {\n onComposerSubmit,\n onSubmit,\n disabled,\n chatId,\n branchId,\n asChild,\n ...props\n },\n forwardedRef\n ) => {\n const Component = asChild ? Slot : \"form\";\n const client = useClient();\n const formRef = useRef<HTMLFormElement | null>(null);\n const editor = useInitial(() =>\n withNormalize(withHistory(withReact(createEditor())))\n );\n const [isEditorEmpty, setEditorEmpty] = useState(true);\n const [isSubmitting, setSubmitting] = useState(false);\n const [isFocused, setFocused] = useState(false);\n const messagesΣ = chatId\n ? client[kInternal].ai.signals.getChatMessagesForBranchΣ(chatId, branchId)\n : emptyMessagesΣ;\n const lastMessageId = useSignal(messagesΣ, getLastMessageId);\n const abortableMessageId = useSignal(messagesΣ, getAbortableMessageId);\n\n const isDisabled = isSubmitting || disabled === true;\n const canAbort = abortableMessageId !== undefined;\n const canSubmit = !isEditorEmpty && !canAbort;\n\n const clear = useCallback(() => {\n SlateTransforms.delete(editor, {\n at: {\n anchor: SlateEditor.start(editor, []),\n focus: SlateEditor.end(editor, []),\n },\n });\n }, [editor]);\n\n const select = useCallback(() => {\n SlateTransforms.select(editor, SlateEditor.end(editor, []));\n }, [editor]);\n\n const focus = useCallback(\n (resetSelection = true) => {\n try {\n if (!ReactEditor.isFocused(editor)) {\n SlateTransforms.select(\n editor,\n resetSelection || !editor.selection\n ? SlateEditor.end(editor, [])\n : editor.selection\n );\n ReactEditor.focus(editor);\n }\n } catch {\n // Slate's DOM-specific methods will throw if the editor's DOM\n // node no longer exists. This action doesn't make sense on an\n // unmounted editor so we can safely ignore it.\n }\n },\n [editor]\n );\n\n const blur = useCallback(() => {\n try {\n ReactEditor.blur(editor);\n } catch {\n // Slate's DOM-specific methods will throw if the editor's DOM\n // node no longer exists. This action doesn't make sense on an\n // unmounted editor so we can safely ignore it.\n }\n }, [editor]);\n\n const onSubmitEnd = useCallback(() => {\n clear();\n setSubmitting(false);\n }, [clear]);\n\n const handleSubmit = useCallback(\n (event: FormEvent<HTMLFormElement>) => {\n if (disabled) {\n return;\n }\n\n // In some situations (e.g. pressing Enter while composing diacritics), it's possible\n // for the form to be submitted as empty even though we already checked whether the\n // editor was empty when handling the key press.\n const isEditorEmpty = isEmpty(editor, editor.children);\n\n // We even prevent the user's `onSubmit` handler from being called if the editor is empty.\n if (isEditorEmpty) {\n event.preventDefault();\n\n return;\n }\n\n onSubmit?.(event);\n\n if (onComposerSubmit === undefined || event.isDefaultPrevented()) {\n event.preventDefault();\n return;\n }\n\n // Extract the text content from the editor.\n const content = editor.children\n .map((block) => {\n if (\"type\" in block && block.type === \"paragraph\") {\n return block.children\n .map((child) => {\n if (\"text\" in child) {\n return child.text;\n }\n return \"\";\n })\n .join(\"\");\n }\n return \"\";\n })\n .join(\"\\n\");\n\n const promise = onComposerSubmit(\n { text: content, lastMessageId },\n event\n );\n\n event.preventDefault();\n\n if (promise) {\n setSubmitting(true);\n promise.then(onSubmitEnd);\n } else {\n onSubmitEnd();\n }\n },\n [disabled, editor, onSubmit, onComposerSubmit, onSubmitEnd, lastMessageId]\n );\n\n useLayoutEffect(() => {\n setEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const handleEditorValueChange = useCallback(() => {\n setEditorEmpty(isEmpty(editor, editor.children));\n }, [editor]);\n\n const submit = useCallback(() => {\n if (!canSubmit) {\n return;\n }\n\n // We need to wait for the next frame in some cases like when composing diacritics,\n // we want any native handling to be done first while still being handled on `keydown`.\n requestAnimationFrame(() => {\n if (formRef.current) {\n requestSubmit(formRef.current);\n }\n });\n }, [canSubmit]);\n\n const abort = useCallback(() => {\n if (!canAbort || !abortableMessageId) {\n return;\n }\n\n client[kInternal].ai.abort(abortableMessageId);\n }, [canAbort, abortableMessageId, client]);\n\n useImperativeHandle<HTMLFormElement | null, HTMLFormElement | null>(\n forwardedRef,\n () => formRef.current,\n []\n );\n\n return (\n <AiComposerEditorContext.Provider\n value={{\n editor,\n onEditorValueChange: handleEditorValueChange,\n abortableMessageId,\n setFocused,\n }}\n >\n <AiComposerContext.Provider\n value={{\n isDisabled,\n isEmpty: isEditorEmpty,\n isFocused,\n canSubmit,\n canAbort,\n submit,\n abort,\n clear,\n focus,\n blur,\n select,\n }}\n >\n <Component onSubmit={handleSubmit} {...props} ref={formRef} />\n </AiComposerContext.Provider>\n </AiComposerEditorContext.Provider>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Editor\n * -----------------------------------------------------------------------------------------------*/\n\nfunction AiComposerEditorPlaceholder({\n attributes,\n children,\n}: RenderPlaceholderProps) {\n const { opacity: _opacity, ...style } = attributes.style;\n\n return (\n <span {...attributes} style={style} data-placeholder=\"\">\n {children}\n </span>\n );\n}\n\n/**\n * Displays the AI composer's editor.\n *\n * @example\n * <AiComposer.Editor placeholder=\"Write a message…\" />\n */\nconst AiComposerEditor = forwardRef<HTMLDivElement, AiComposerEditorProps>(\n (\n {\n defaultValue = \"\",\n onKeyDown,\n onFocus,\n onBlur,\n disabled,\n autoFocus,\n dir,\n ...props\n },\n forwardedRef\n ) => {\n const { editor, onEditorValueChange, setFocused } =\n useAiComposerEditorContext();\n const {\n submit,\n isDisabled: isComposerDisabled,\n isFocused,\n focus,\n blur,\n select,\n } = useAiComposer();\n const isDisabled = disabled || isComposerDisabled;\n\n const handleKeyDown = useCallback(\n (event: KeyboardEvent<HTMLDivElement>) => {\n onKeyDown?.(event);\n if (event.isDefaultPrevented()) return;\n\n if (event.key === \"Enter\" && !event.shiftKey) {\n event.preventDefault();\n submit();\n } else if (event.key === \"Enter\" && event.shiftKey) {\n event.preventDefault();\n editor.insertBreak();\n } else if (event.key === \"Escape\") {\n blur();\n }\n },\n [editor, onKeyDown, submit, blur]\n );\n\n const handleFocus = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onFocus?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(true);\n }\n },\n [onFocus, setFocused]\n );\n\n const handleBlur = useCallback(\n (event: FocusEvent<HTMLDivElement>) => {\n onBlur?.(event);\n\n if (!event.isDefaultPrevented()) {\n setFocused(false);\n }\n },\n [onBlur, setFocused]\n );\n\n useImperativeHandle(\n forwardedRef,\n () => ReactEditor.toDOMNode(editor, editor) as HTMLDivElement,\n [editor]\n );\n\n // Manually focus the editor when `autoFocus` is true\n useLayoutEffect(() => {\n if (autoFocus) {\n focus();\n }\n }, [autoFocus, editor, focus]);\n\n // Manually add a selection in the editor if the selection\n // is still empty after being focused\n useLayoutEffect(() => {\n if (isFocused && editor.selection === null) {\n select();\n }\n }, [editor, select, isFocused]);\n\n const initialValue: AiComposerBody = useMemo(() => {\n return defaultValue\n .split(\"\\n\")\n .map((text) => ({ type: \"paragraph\", children: [{ text }] }));\n }, [defaultValue]);\n\n return (\n <Slate\n editor={editor}\n initialValue={initialValue}\n onValueChange={onEditorValueChange}\n >\n <Editable\n dir={dir}\n enterKeyHint=\"send\"\n autoCapitalize=\"sentences\"\n aria-label=\"Composer editor\"\n onKeyDown={handleKeyDown}\n onFocus={handleFocus}\n onBlur={handleBlur}\n data-focused={isFocused || undefined}\n data-disabled={isDisabled || undefined}\n {...props}\n readOnly={isDisabled}\n disabled={isDisabled}\n renderPlaceholder={AiComposerEditorPlaceholder}\n />\n </Slate>\n );\n }\n);\n\n/* -------------------------------------------------------------------------------------------------\n * Submit\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A button to submit the AI composer's content.\n *\n * @example\n * <AiComposer.Submit>Send</AiComposer.Submit>\n */\nexport const AiComposerSubmit = forwardRef<\n HTMLButtonElement,\n AiComposerSubmitProps\n>(({ disabled, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { isDisabled: isComposerDisabled, canSubmit } = useAiComposer();\n const isDisabled = isComposerDisabled || disabled || !canSubmit;\n\n return (\n <Component\n type=\"submit\"\n {...props}\n ref={forwardedRef}\n disabled={isDisabled}\n />\n );\n});\n\n/* -------------------------------------------------------------------------------------------------\n * Abort\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * A button to abort a response related to the AI composer.\n *\n * @example\n * <AiComposer.Abort>Cancel</AiComposer.Abort>\n */\nexport const AiComposerAbort = forwardRef<\n HTMLButtonElement,\n AiComposerSubmitProps\n>(({ disabled, onClick, asChild, ...props }, forwardedRef) => {\n const Component = asChild ? Slot : \"button\";\n const { isDisabled: isComposerDisabled, canAbort, abort } = useAiComposer();\n const isDisabled = isComposerDisabled || disabled || !canAbort;\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLButtonElement>) => {\n onClick?.(event);\n\n if (event.isDefaultPrevented()) {\n return;\n }\n\n abort();\n },\n [abort, onClick]\n );\n\n return (\n <Component\n type=\"button\"\n {...props}\n ref={forwardedRef}\n disabled={isDisabled}\n onClick={handleClick}\n />\n );\n});\n\nif (process.env.NODE_ENV !== \"production\") {\n AiComposerEditor.displayName = AI_COMPOSER_EDITOR_NAME;\n AiComposerForm.displayName = AI_COMPOSER_FORM_NAME;\n AiComposerSubmit.displayName = AI_COMPOSER_SUBMIT_NAME;\n AiComposerAbort.displayName = AI_COMPOSER_ABORT_NAME;\n}\n\n// NOTE: Every export from this file will be available publicly as AiComposer.*\nexport {\n AiComposerAbort as Abort,\n AiComposerEditor as Editor,\n AiComposerForm as Form,\n AiComposerSubmit as Submit,\n};\n"],"names":["Signal","forwardRef","Slot","useClient","useRef","useInitial","withNormalize","withHistory","withReact","createEditor","useState","kInternal","useSignal","useCallback","SlateTransforms","SlateEditor","ReactEditor","isEditorEmpty","isEmpty","useLayoutEffect","requestSubmit","useImperativeHandle","jsx","AiComposerEditorContext","AiComposerContext","useAiComposerEditorContext","useAiComposer","useMemo","Slate","Editable"],"mappings":"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"}