@liveblocks/react-tiptap 3.8.0-tiptap1 → 3.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/LiveblocksExtension.cjs +3 -3
- package/dist/LiveblocksExtension.cjs.map +1 -1
- package/dist/LiveblocksExtension.js +3 -3
- package/dist/LiveblocksExtension.js.map +1 -1
- package/dist/ai/AiExtension.cjs.map +1 -1
- package/dist/ai/AiExtension.js.map +1 -1
- package/dist/ai/AiToolbar.cjs.map +1 -1
- package/dist/ai/AiToolbar.js.map +1 -1
- package/dist/comments/AnchoredThreads.cjs +1 -1
- package/dist/comments/AnchoredThreads.cjs.map +1 -1
- package/dist/comments/AnchoredThreads.js +1 -1
- package/dist/comments/AnchoredThreads.js.map +1 -1
- package/dist/comments/CommentsExtension.cjs.map +1 -1
- package/dist/comments/CommentsExtension.js.map +1 -1
- package/dist/comments/FloatingComposer.cjs +3 -7
- package/dist/comments/FloatingComposer.cjs.map +1 -1
- package/dist/comments/FloatingComposer.js +3 -7
- package/dist/comments/FloatingComposer.js.map +1 -1
- package/dist/index.d.cts +4 -135
- package/dist/index.d.ts +4 -135
- package/dist/mentions/GroupMentionNode.cjs.map +1 -1
- package/dist/mentions/GroupMentionNode.js.map +1 -1
- package/dist/mentions/Mention.cjs +50 -41
- package/dist/mentions/Mention.cjs.map +1 -1
- package/dist/mentions/Mention.js +49 -40
- package/dist/mentions/Mention.js.map +1 -1
- package/dist/mentions/MentionNode.cjs.map +1 -1
- package/dist/mentions/MentionNode.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/version-history/HistoryVersionPreview.cjs +0 -1
- package/dist/version-history/HistoryVersionPreview.cjs.map +1 -1
- package/dist/version-history/HistoryVersionPreview.js +0 -1
- 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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiExtension.js","sources":["../../src/ai/AiExtension.ts"],"sourcesContent":["import {\n autoRetry,\n type ContextualPromptResponse,\n HttpError,\n} from \"@liveblocks/core\";\nimport type { CommandProps, Editor } from \"@tiptap/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { Fragment, Slice } from \"@tiptap/pm/model\";\nimport type { Transaction } from \"@tiptap/pm/state\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport {\n ySyncPluginKey,\n yXmlFragmentToProseMirrorFragment,\n} from \"y-prosemirror\";\nimport type { Doc, Snapshot } from \"yjs\";\nimport {\n createDocFromSnapshot,\n emptySnapshot,\n equalSnapshots,\n snapshot as takeSnapshot,\n} from \"yjs\";\n\nimport {\n AI_TOOLBAR_SELECTION_PLUGIN,\n type AiCommands,\n type AiExtensionOptions,\n type AiExtensionStorage,\n type AiToolbarState,\n type ResolveContextualPromptResponse,\n type YSyncPluginState,\n} from \"../types\";\nimport { getContextualPromptContext } from \"../utils\";\n\nconst DEFAULT_AI_NAME = \"AI\";\nexport const DEFAULT_STATE: AiToolbarState = { phase: \"closed\" };\n\nconst RESOLVE_AI_PROMPT_RETRY_ATTEMPTS = 3;\nconst RESOLVE_AI_PROMPT_RETRY_DELAYS = [1000, 2000, 4000];\n\nfunction getYjsBinding(editor: Editor) {\n return (ySyncPluginKey.getState(editor.view.state) as YSyncPluginState)\n .binding;\n}\n\nfunction getLiveblocksYjsProvider(editor: Editor) {\n return editor.extensionStorage.liveblocksExtension?.provider;\n}\n\nexport function isContextualPromptDiffResponse(\n response: ContextualPromptResponse\n): response is Extract<\n ContextualPromptResponse,\n { type: \"replace\" | \"insert\" }\n> {\n return response.type === \"replace\" || response.type === \"insert\";\n}\n\nfunction isResolveContextualPromptResponse(\n response: unknown\n): response is ResolveContextualPromptResponse {\n return (\n typeof response === \"object\" &&\n response !== null &&\n typeof (response as { text: unknown }).text === \"string\" &&\n typeof (response as { type: unknown }).type === \"string\" &&\n [\"insert\", \"replace\", \"other\"].includes((response as { type: string }).type)\n );\n}\n\nfunction createParagraph(editor: Editor, text: string) {\n const paragraph =\n editor.schema.nodes.paragraph ??\n Object.values(editor.schema.nodes).find((node) => node.isBlock);\n\n if (!paragraph) {\n throw new Error(\"Could not create a paragraph.\");\n }\n\n return paragraph.create(null, text ? editor.schema.text(text) : undefined);\n}\n\nfunction getRevertTransaction(\n tr: Transaction,\n editor: Editor,\n storage: AiExtensionStorage,\n doc?: Doc\n): Transaction | null {\n if (storage.snapshot) {\n const binding = getYjsBinding(editor);\n\n if (binding) {\n binding.mapping.clear();\n\n const docFromSnapshot = createDocFromSnapshot(\n binding.doc,\n storage.snapshot\n );\n const type = docFromSnapshot.getXmlFragment(\"default\"); // TODO: field\n const fragmentContent = yXmlFragmentToProseMirrorFragment(\n type,\n editor.state.schema\n );\n\n tr.setMeta(\"addToHistory\", false);\n tr.replace(\n 0,\n editor.state.doc.content.size,\n new Slice(Fragment.from(fragmentContent), 0, 0)\n );\n tr.setMeta(ySyncPluginKey, {\n snapshot: null,\n prevSnapshot: null,\n });\n\n if (doc) {\n doc.gc = true;\n }\n\n storage.snapshot = undefined;\n\n return tr;\n }\n }\n return null;\n}\n\nexport const AiExtension = Extension.create<\n AiExtensionOptions,\n AiExtensionStorage\n>({\n name: \"liveblocksAi\",\n addOptions() {\n return {\n doc: undefined,\n pud: undefined,\n\n // The actual default resolver is set in LiveblocksExtension via AiExtension.configure()\n resolveContextualPrompt: () => Promise.reject(),\n name: DEFAULT_AI_NAME,\n };\n },\n addStorage() {\n return {\n state: DEFAULT_STATE,\n name: this.options.name,\n };\n },\n addCommands() {\n return {\n askAi: (prompt) => () => {\n if (typeof prompt === \"string\") {\n (\n this.editor.commands as unknown as AiCommands\n ).$startAiToolbarThinking(prompt);\n } else {\n (\n this.editor.commands as unknown as AiCommands\n ).$openAiToolbarAsking();\n }\n\n return true;\n },\n\n closeAi: () => () => {\n (this.editor.commands as unknown as AiCommands).$closeAiToolbar();\n\n return true;\n },\n\n $acceptAiToolbarResponse:\n () =>\n ({ tr, view }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"reviewing\" phase, do nothing\n if (currentState.phase !== \"reviewing\") {\n return false;\n }\n\n // 2. Accept the response\n if (isContextualPromptDiffResponse(currentState.response)) {\n // 2.a. If the response is a diff, apply it definitely\n const binding = getYjsBinding(this.editor);\n if (!binding) {\n return false;\n }\n\n const fragmentContent = yXmlFragmentToProseMirrorFragment(\n binding.type,\n this.editor.state.schema\n );\n tr.setMeta(\"addToHistory\", false);\n tr.replace(\n 0,\n this.editor.state.doc.content.size,\n new Slice(Fragment.from(fragmentContent), 0, 0)\n );\n tr.setMeta(ySyncPluginKey, {\n snapshot: null,\n prevSnapshot: null,\n });\n\n this.storage.snapshot = undefined;\n } else {\n // 2.b. If the response is not a diff, insert it below the selection\n\n const paragraphs = currentState.response.text\n .split(\"\\n\")\n .map((paragraph) => createParagraph(this.editor, paragraph));\n\n tr.insert(this.editor.state.selection.$to.end(), paragraphs);\n tr.setMeta(\"addToHistory\", true);\n view.dispatch(tr);\n // Prevent TipTap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n }\n\n // 3. Unblock the editor\n getLiveblocksYjsProvider(this.editor)?.unpause();\n this.editor.setEditable(true);\n\n // 4. Set to \"closed\" phase\n this.storage.state = { phase: \"closed\" };\n\n return true;\n },\n\n $closeAiToolbar:\n () =>\n ({ tr, view }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If already in \"closed\" phase, do nothing\n if (currentState.phase === \"closed\") {\n return false;\n }\n\n // 2. If in \"thinking\" phase, cancel the current AI request\n if (currentState.phase === \"thinking\") {\n currentState.abortController.abort();\n }\n\n // 3. If in \"thinking\" or \"reviewing\" phase, revert the editor if possible and unblock it\n if (\n currentState.phase === \"thinking\" ||\n currentState.phase === \"reviewing\"\n ) {\n // Get the revert transaction and dispatch it\n const revertTr = getRevertTransaction(\n tr,\n this.editor,\n this.storage,\n this.options.doc\n );\n if (revertTr) {\n view.dispatch(revertTr);\n // Prevent TipTap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n }\n }\n\n // 4. Restore the initial selection\n this.editor.commands.setTextSelection(currentState.initialSelection);\n\n // 5. Unblock the editor\n getLiveblocksYjsProvider(this.editor)?.unpause();\n this.editor.setEditable(true);\n\n // 6. Set to \"closed\" phase\n this.storage.state = { phase: \"closed\" };\n\n return true;\n },\n\n $openAiToolbarAsking: () => () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"closed\" phase, do nothing\n if (currentState.phase !== \"closed\") {\n return false;\n }\n\n // 2. Blur the editor if needed\n if (this.editor.isFocused) {\n this.editor.commands.blur();\n }\n\n // 3. Set to \"asking\" phase\n this.storage.state = {\n phase: \"asking\",\n // Store the initial selection\n initialSelection: {\n from: this.editor.state.selection.from,\n to: this.editor.state.selection.to,\n },\n // Initialize the custom prompt as empty\n customPrompt: \"\",\n };\n\n return true;\n },\n\n $startAiToolbarThinking:\n (prompt: string, withPreviousResponse?: boolean) =>\n ({ tr, view }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If in \"thinking\" phase already, do nothing\n if (currentState.phase === \"thinking\") {\n return false;\n }\n\n // 2. Blur the editor if needed\n if (this.editor.isFocused) {\n this.editor.commands.blur();\n }\n\n const abortController = new AbortController();\n const provider = getLiveblocksYjsProvider(this.editor);\n\n // 3. If this is a retry or a refinement, revert the editor and restore the initial selection\n if (currentState.phase === \"reviewing\") {\n // 3.a. Revert the editor\n const revertTr = getRevertTransaction(\n tr,\n this.editor,\n this.storage,\n this.options.doc\n );\n if (revertTr) {\n // Important: in this scenario we do not unpause the provider\n view.dispatch(revertTr);\n // Prevent Tiptap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n }\n\n // 3.b. Restore the initial selection\n this.editor.commands.setTextSelection(\n currentState.initialSelection\n );\n }\n\n // 4. Set to \"thinking\" phase\n this.storage.state = {\n phase: \"thinking\",\n // Store the initial selection if the toolbar is opened directly in the \"thinking\" phase\n initialSelection: currentState.initialSelection ?? {\n from: this.editor.state.selection.from,\n to: this.editor.state.selection.to,\n },\n // Initialize the custom prompt as empty if the toolbar is opened directly in the \"thinking\" phase\n customPrompt: currentState.customPrompt ?? \"\",\n prompt,\n abortController,\n previousResponse: currentState.response,\n };\n\n // 5. Block the editor\n this.editor.setEditable(false);\n\n // 6. Start the AI request\n autoRetry(\n async () => {\n await provider?.pause();\n\n // 6.a. Resolve the AI prompt\n const response = (await this.options.resolveContextualPrompt({\n prompt,\n context: getContextualPromptContext(this.editor, 3_000),\n signal: abortController.signal,\n previous:\n withPreviousResponse && currentState.phase === \"reviewing\"\n ? {\n prompt: currentState.prompt,\n response: {\n type: currentState.response?.type,\n text: currentState.response?.text,\n },\n }\n : undefined,\n })) as unknown;\n\n // 6.b. Validate the response\n if (isResolveContextualPromptResponse(response)) {\n return response;\n } else {\n throw new Error(\"Failed to resolve AI prompt.\");\n }\n },\n RESOLVE_AI_PROMPT_RETRY_ATTEMPTS,\n RESOLVE_AI_PROMPT_RETRY_DELAYS,\n\n (error) => {\n // Don't retry on 4xx errors or if the request was aborted\n return (\n abortController.signal.aborted ||\n (error instanceof HttpError &&\n error.status >= 400 &&\n error.status < 500)\n );\n }\n )\n .then((response) => {\n if (abortController.signal.aborted) {\n return;\n }\n\n // 6.a. If the AI request succeeds, set to \"reviewing\" phase with the response\n (\n this.editor.commands as unknown as AiCommands\n )._handleAiToolbarThinkingSuccess({\n type: response.type,\n text: response.text,\n });\n })\n .catch((error) => {\n if (abortController.signal.aborted) {\n return;\n }\n\n // 6.b. If the AI request fails, set to \"asking\" phase with error\n (\n this.editor.commands as unknown as AiCommands\n )._handleAiToolbarThinkingError(error);\n });\n\n return true;\n },\n\n $cancelAiToolbarThinking: () => () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"thinking\" phase, do nothing\n if (currentState.phase !== \"thinking\") {\n return false;\n }\n\n // 2. Cancel the current AI request\n currentState.abortController.abort();\n\n // 3. Unblock the editor\n this.editor.setEditable(true);\n\n // 4. Set to \"asking\" phase\n this.storage.state = {\n phase: \"asking\",\n initialSelection: currentState.initialSelection,\n // If the custom prompt is different than the prompt, reset it\n customPrompt:\n currentState.prompt === currentState.customPrompt\n ? currentState.customPrompt\n : \"\",\n };\n\n return true;\n },\n\n _showAiToolbarReviewingDiff: () => () => {\n // The diff is applied right before moving to the \"reviewing\" phase\n if (this.storage.state.phase !== \"reviewing\") {\n return false;\n }\n\n if (!this.options.doc || !this.storage.snapshot) {\n return false;\n }\n\n const previousSnapshot: Snapshot =\n this.storage.snapshot ?? emptySnapshot;\n const currentSnapshot = takeSnapshot(this.options.doc);\n\n if (equalSnapshots(previousSnapshot, currentSnapshot)) {\n return true;\n }\n\n getYjsBinding(this.editor)?.renderSnapshot(\n currentSnapshot,\n previousSnapshot\n );\n\n return true;\n },\n\n _handleAiToolbarThinkingSuccess:\n (response: ContextualPromptResponse) =>\n ({ view, tr }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"thinking\" phase, do nothing\n if (currentState.phase !== \"thinking\") {\n return false;\n }\n\n // 2. If this is not a diff, the response will just be in the toolbar, set to \"reviewing\" phase directly with the response\n if (!isContextualPromptDiffResponse(response)) {\n this.storage.state = {\n phase: \"reviewing\",\n initialSelection: currentState.initialSelection,\n customPrompt: \"\",\n prompt: currentState.prompt,\n response,\n };\n\n return true;\n }\n\n if (!this.options.doc) {\n return false;\n }\n\n // 3. Otherwise, the response is a diff, apply it to the editor\n this.options.doc.gc = false;\n this.storage.snapshot = takeSnapshot(this.options.doc);\n\n // 4. Set to \"reviewing\" phase with the new range\n this.storage.state = {\n phase: \"reviewing\",\n initialSelection: currentState.initialSelection,\n customPrompt: \"\",\n prompt: currentState.prompt,\n response,\n };\n\n // 5. Insert the response's text as inline first (and replace the selection if it's a replace) then as block if there are multiple paragraphs\n const [firstParagraph, ...otherParagraphs] =\n response.text.split(\"\\n\");\n\n tr.insertText(\n firstParagraph,\n response.type === \"insert\"\n ? this.editor.state.selection.to\n : this.editor.state.selection.from,\n this.editor.state.selection.to\n );\n\n if (otherParagraphs.length > 0) {\n const paragraphs = otherParagraphs.map((paragraph) =>\n createParagraph(this.editor, paragraph)\n );\n\n tr.insert(tr.selection.$to.pos, paragraphs);\n }\n\n view.dispatch(tr);\n // Prevent Tiptap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n\n // 6. Show the diff\n (\n this.editor.commands as unknown as AiCommands\n )._showAiToolbarReviewingDiff();\n\n // We moved to the \"reviewing\" phase, so even if `_showAiToolbarReviewingDiff`\n // returns `false` somehow, we still want to return `true`\n return true;\n },\n\n _handleAiToolbarThinkingError: (error: unknown) => () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"thinking\" phase, do nothing\n if (currentState.phase !== \"thinking\") {\n return false;\n }\n\n // 2. Unblock the editor\n this.editor.setEditable(true);\n\n // 3. Log the error\n console.error(error);\n\n // 4. Set to \"asking\" phase with error\n this.storage.state = {\n phase: \"asking\",\n initialSelection: currentState.initialSelection,\n // If the custom prompt is different than the prompt, reset it\n customPrompt:\n currentState.prompt === currentState.customPrompt\n ? currentState.customPrompt\n : \"\",\n // Pass the error so it can be displayed\n error:\n error instanceof Error\n ? error\n : new Error(String(error), { cause: error }),\n };\n\n return true;\n },\n\n _updateAiToolbarCustomPrompt:\n (customPrompt: string | ((currentCustomPrompt: string) => string)) =>\n () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in a phase with a custom prompt, do nothing\n if (typeof currentState.customPrompt !== \"string\") {\n return false;\n }\n\n // 2. Update the custom prompt\n this.storage.state.customPrompt =\n typeof customPrompt === \"function\"\n ? customPrompt(currentState.customPrompt)\n : customPrompt;\n\n return true;\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: AI_TOOLBAR_SELECTION_PLUGIN,\n props: {\n decorations: ({ doc, selection }) => {\n // Don't show the AI toolbar selection if the toolbar is closed or when reviewing diff responses\n if (\n this.storage.state.phase === \"closed\" ||\n (this.storage.state.phase === \"reviewing\" &&\n isContextualPromptDiffResponse(this.storage.state.response))\n ) {\n return DecorationSet.create(doc, []);\n }\n\n const { from, to } = selection;\n const decorations: Decoration[] = [\n Decoration.inline(from, to, {\n class: \"lb-root lb-selection lb-tiptap-active-selection\",\n }),\n ];\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n"],"names":["takeSnapshot"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiExtension.js","sources":["../../src/ai/AiExtension.ts"],"sourcesContent":["import {\n autoRetry,\n type ContextualPromptResponse,\n HttpError,\n} from \"@liveblocks/core\";\nimport type { LiveblocksYjsProvider } from \"@liveblocks/yjs\";\nimport type { CommandProps, Editor } from \"@tiptap/core\";\nimport { Extension } from \"@tiptap/core\";\nimport { Fragment, Slice } from \"@tiptap/pm/model\";\nimport type { Transaction } from \"@tiptap/pm/state\";\nimport { Plugin } from \"@tiptap/pm/state\";\nimport { Decoration, DecorationSet } from \"@tiptap/pm/view\";\nimport {\n ySyncPluginKey,\n yXmlFragmentToProseMirrorFragment,\n} from \"y-prosemirror\";\nimport type { Doc, Snapshot } from \"yjs\";\nimport {\n createDocFromSnapshot,\n emptySnapshot,\n equalSnapshots,\n snapshot as takeSnapshot,\n} from \"yjs\";\n\nimport {\n AI_TOOLBAR_SELECTION_PLUGIN,\n type AiCommands,\n type AiExtensionOptions,\n type AiExtensionStorage,\n type AiToolbarState,\n type LiveblocksExtensionStorage,\n type ResolveContextualPromptResponse,\n type YSyncPluginState,\n} from \"../types\";\nimport { getContextualPromptContext } from \"../utils\";\n\nconst DEFAULT_AI_NAME = \"AI\";\nexport const DEFAULT_STATE: AiToolbarState = { phase: \"closed\" };\n\nconst RESOLVE_AI_PROMPT_RETRY_ATTEMPTS = 3;\nconst RESOLVE_AI_PROMPT_RETRY_DELAYS = [1000, 2000, 4000];\n\nfunction getYjsBinding(editor: Editor) {\n return (ySyncPluginKey.getState(editor.view.state) as YSyncPluginState)\n .binding;\n}\n\nfunction getLiveblocksYjsProvider(editor: Editor) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-assertion\n return (\n editor.extensionStorage.liveblocksExtension as\n | LiveblocksExtensionStorage\n | undefined\n )?.provider as LiveblocksYjsProvider | undefined;\n}\n\nexport function isContextualPromptDiffResponse(\n response: ContextualPromptResponse\n): response is Extract<\n ContextualPromptResponse,\n { type: \"replace\" | \"insert\" }\n> {\n return response.type === \"replace\" || response.type === \"insert\";\n}\n\nfunction isResolveContextualPromptResponse(\n response: unknown\n): response is ResolveContextualPromptResponse {\n return (\n typeof response === \"object\" &&\n response !== null &&\n typeof (response as { text: unknown }).text === \"string\" &&\n typeof (response as { type: unknown }).type === \"string\" &&\n [\"insert\", \"replace\", \"other\"].includes((response as { type: string }).type)\n );\n}\n\nfunction createParagraph(editor: Editor, text: string) {\n const paragraph =\n editor.schema.nodes.paragraph ??\n Object.values(editor.schema.nodes).find((node) => node.isBlock);\n\n if (!paragraph) {\n throw new Error(\"Could not create a paragraph.\");\n }\n\n return paragraph.create(null, text ? editor.schema.text(text) : undefined);\n}\n\nfunction getRevertTransaction(\n tr: Transaction,\n editor: Editor,\n storage: AiExtensionStorage,\n doc?: Doc\n): Transaction | null {\n if (storage.snapshot) {\n const binding = getYjsBinding(editor);\n\n if (binding) {\n binding.mapping.clear();\n\n const docFromSnapshot = createDocFromSnapshot(\n binding.doc,\n storage.snapshot\n );\n const type = docFromSnapshot.getXmlFragment(\"default\"); // TODO: field\n const fragmentContent = yXmlFragmentToProseMirrorFragment(\n type,\n editor.state.schema\n );\n\n tr.setMeta(\"addToHistory\", false);\n tr.replace(\n 0,\n editor.state.doc.content.size,\n new Slice(Fragment.from(fragmentContent), 0, 0)\n );\n tr.setMeta(ySyncPluginKey, {\n snapshot: null,\n prevSnapshot: null,\n });\n\n if (doc) {\n doc.gc = true;\n }\n\n storage.snapshot = undefined;\n\n return tr;\n }\n }\n return null;\n}\n\nexport const AiExtension = Extension.create<\n AiExtensionOptions,\n AiExtensionStorage\n>({\n name: \"liveblocksAi\",\n addOptions() {\n return {\n doc: undefined,\n pud: undefined,\n\n // The actual default resolver is set in LiveblocksExtension via AiExtension.configure()\n resolveContextualPrompt: () => Promise.reject(),\n name: DEFAULT_AI_NAME,\n };\n },\n addStorage() {\n return {\n state: DEFAULT_STATE,\n name: this.options.name,\n };\n },\n addCommands() {\n return {\n askAi: (prompt) => () => {\n if (typeof prompt === \"string\") {\n (\n this.editor.commands as unknown as AiCommands\n ).$startAiToolbarThinking(prompt);\n } else {\n (\n this.editor.commands as unknown as AiCommands\n ).$openAiToolbarAsking();\n }\n\n return true;\n },\n\n closeAi: () => () => {\n (this.editor.commands as unknown as AiCommands).$closeAiToolbar();\n\n return true;\n },\n\n $acceptAiToolbarResponse:\n () =>\n ({ tr, view }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"reviewing\" phase, do nothing\n if (currentState.phase !== \"reviewing\") {\n return false;\n }\n\n // 2. Accept the response\n if (isContextualPromptDiffResponse(currentState.response)) {\n // 2.a. If the response is a diff, apply it definitely\n const binding = getYjsBinding(this.editor);\n if (!binding) {\n return false;\n }\n\n const fragmentContent = yXmlFragmentToProseMirrorFragment(\n binding.type,\n this.editor.state.schema\n );\n tr.setMeta(\"addToHistory\", false);\n tr.replace(\n 0,\n this.editor.state.doc.content.size,\n new Slice(Fragment.from(fragmentContent), 0, 0)\n );\n tr.setMeta(ySyncPluginKey, {\n snapshot: null,\n prevSnapshot: null,\n });\n\n this.storage.snapshot = undefined;\n } else {\n // 2.b. If the response is not a diff, insert it below the selection\n\n const paragraphs = currentState.response.text\n .split(\"\\n\")\n .map((paragraph) => createParagraph(this.editor, paragraph));\n\n tr.insert(this.editor.state.selection.$to.end(), paragraphs);\n tr.setMeta(\"addToHistory\", true);\n view.dispatch(tr);\n // Prevent TipTap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n }\n\n // 3. Unblock the editor\n getLiveblocksYjsProvider(this.editor)?.unpause();\n this.editor.setEditable(true);\n\n // 4. Set to \"closed\" phase\n this.storage.state = { phase: \"closed\" };\n\n return true;\n },\n\n $closeAiToolbar:\n () =>\n ({ tr, view }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If already in \"closed\" phase, do nothing\n if (currentState.phase === \"closed\") {\n return false;\n }\n\n // 2. If in \"thinking\" phase, cancel the current AI request\n if (currentState.phase === \"thinking\") {\n currentState.abortController.abort();\n }\n\n // 3. If in \"thinking\" or \"reviewing\" phase, revert the editor if possible and unblock it\n if (\n currentState.phase === \"thinking\" ||\n currentState.phase === \"reviewing\"\n ) {\n // Get the revert transaction and dispatch it\n const revertTr = getRevertTransaction(\n tr,\n this.editor,\n this.storage,\n this.options.doc\n );\n if (revertTr) {\n view.dispatch(revertTr);\n // Prevent TipTap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n }\n }\n\n // 4. Restore the initial selection\n this.editor.commands.setTextSelection(currentState.initialSelection);\n\n // 5. Unblock the editor\n getLiveblocksYjsProvider(this.editor)?.unpause();\n this.editor.setEditable(true);\n\n // 6. Set to \"closed\" phase\n this.storage.state = { phase: \"closed\" };\n\n return true;\n },\n\n $openAiToolbarAsking: () => () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"closed\" phase, do nothing\n if (currentState.phase !== \"closed\") {\n return false;\n }\n\n // 2. Blur the editor if needed\n if (this.editor.isFocused) {\n this.editor.commands.blur();\n }\n\n // 3. Set to \"asking\" phase\n this.storage.state = {\n phase: \"asking\",\n // Store the initial selection\n initialSelection: {\n from: this.editor.state.selection.from,\n to: this.editor.state.selection.to,\n },\n // Initialize the custom prompt as empty\n customPrompt: \"\",\n };\n\n return true;\n },\n\n $startAiToolbarThinking:\n (prompt: string, withPreviousResponse?: boolean) =>\n ({ tr, view }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If in \"thinking\" phase already, do nothing\n if (currentState.phase === \"thinking\") {\n return false;\n }\n\n // 2. Blur the editor if needed\n if (this.editor.isFocused) {\n this.editor.commands.blur();\n }\n\n const abortController = new AbortController();\n const provider = getLiveblocksYjsProvider(this.editor);\n\n // 3. If this is a retry or a refinement, revert the editor and restore the initial selection\n if (currentState.phase === \"reviewing\") {\n // 3.a. Revert the editor\n const revertTr = getRevertTransaction(\n tr,\n this.editor,\n this.storage,\n this.options.doc\n );\n if (revertTr) {\n // Important: in this scenario we do not unpause the provider\n view.dispatch(revertTr);\n // Prevent Tiptap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n }\n\n // 3.b. Restore the initial selection\n this.editor.commands.setTextSelection(\n currentState.initialSelection\n );\n }\n\n // 4. Set to \"thinking\" phase\n this.storage.state = {\n phase: \"thinking\",\n // Store the initial selection if the toolbar is opened directly in the \"thinking\" phase\n initialSelection: currentState.initialSelection ?? {\n from: this.editor.state.selection.from,\n to: this.editor.state.selection.to,\n },\n // Initialize the custom prompt as empty if the toolbar is opened directly in the \"thinking\" phase\n customPrompt: currentState.customPrompt ?? \"\",\n prompt,\n abortController,\n previousResponse: currentState.response,\n };\n\n // 5. Block the editor\n this.editor.setEditable(false);\n\n // 6. Start the AI request\n autoRetry(\n async () => {\n await provider?.pause();\n\n // 6.a. Resolve the AI prompt\n const response = (await this.options.resolveContextualPrompt({\n prompt,\n context: getContextualPromptContext(this.editor, 3_000),\n signal: abortController.signal,\n previous:\n withPreviousResponse && currentState.phase === \"reviewing\"\n ? {\n prompt: currentState.prompt,\n response: {\n type: currentState.response?.type,\n text: currentState.response?.text,\n },\n }\n : undefined,\n })) as unknown;\n\n // 6.b. Validate the response\n if (isResolveContextualPromptResponse(response)) {\n return response;\n } else {\n throw new Error(\"Failed to resolve AI prompt.\");\n }\n },\n RESOLVE_AI_PROMPT_RETRY_ATTEMPTS,\n RESOLVE_AI_PROMPT_RETRY_DELAYS,\n\n (error) => {\n // Don't retry on 4xx errors or if the request was aborted\n return (\n abortController.signal.aborted ||\n (error instanceof HttpError &&\n error.status >= 400 &&\n error.status < 500)\n );\n }\n )\n .then((response) => {\n if (abortController.signal.aborted) {\n return;\n }\n\n // 6.a. If the AI request succeeds, set to \"reviewing\" phase with the response\n (\n this.editor.commands as unknown as AiCommands\n )._handleAiToolbarThinkingSuccess({\n type: response.type,\n text: response.text,\n });\n })\n .catch((error) => {\n if (abortController.signal.aborted) {\n return;\n }\n\n // 6.b. If the AI request fails, set to \"asking\" phase with error\n (\n this.editor.commands as unknown as AiCommands\n )._handleAiToolbarThinkingError(error);\n });\n\n return true;\n },\n\n $cancelAiToolbarThinking: () => () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"thinking\" phase, do nothing\n if (currentState.phase !== \"thinking\") {\n return false;\n }\n\n // 2. Cancel the current AI request\n currentState.abortController.abort();\n\n // 3. Unblock the editor\n this.editor.setEditable(true);\n\n // 4. Set to \"asking\" phase\n this.storage.state = {\n phase: \"asking\",\n initialSelection: currentState.initialSelection,\n // If the custom prompt is different than the prompt, reset it\n customPrompt:\n currentState.prompt === currentState.customPrompt\n ? currentState.customPrompt\n : \"\",\n };\n\n return true;\n },\n\n _showAiToolbarReviewingDiff: () => () => {\n // The diff is applied right before moving to the \"reviewing\" phase\n if (this.storage.state.phase !== \"reviewing\") {\n return false;\n }\n\n if (!this.options.doc || !this.storage.snapshot) {\n return false;\n }\n\n const previousSnapshot: Snapshot =\n this.storage.snapshot ?? emptySnapshot;\n const currentSnapshot = takeSnapshot(this.options.doc);\n\n if (equalSnapshots(previousSnapshot, currentSnapshot)) {\n return true;\n }\n\n getYjsBinding(this.editor)?.renderSnapshot(\n currentSnapshot,\n previousSnapshot\n );\n\n return true;\n },\n\n _handleAiToolbarThinkingSuccess:\n (response: ContextualPromptResponse) =>\n ({ view, tr }: CommandProps) => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"thinking\" phase, do nothing\n if (currentState.phase !== \"thinking\") {\n return false;\n }\n\n // 2. If this is not a diff, the response will just be in the toolbar, set to \"reviewing\" phase directly with the response\n if (!isContextualPromptDiffResponse(response)) {\n this.storage.state = {\n phase: \"reviewing\",\n initialSelection: currentState.initialSelection,\n customPrompt: \"\",\n prompt: currentState.prompt,\n response,\n };\n\n return true;\n }\n\n if (!this.options.doc) {\n return false;\n }\n\n // 3. Otherwise, the response is a diff, apply it to the editor\n this.options.doc.gc = false;\n this.storage.snapshot = takeSnapshot(this.options.doc);\n\n // 4. Set to \"reviewing\" phase with the new range\n this.storage.state = {\n phase: \"reviewing\",\n initialSelection: currentState.initialSelection,\n customPrompt: \"\",\n prompt: currentState.prompt,\n response,\n };\n\n // 5. Insert the response's text as inline first (and replace the selection if it's a replace) then as block if there are multiple paragraphs\n const [firstParagraph, ...otherParagraphs] =\n response.text.split(\"\\n\");\n\n tr.insertText(\n firstParagraph,\n response.type === \"insert\"\n ? this.editor.state.selection.to\n : this.editor.state.selection.from,\n this.editor.state.selection.to\n );\n\n if (otherParagraphs.length > 0) {\n const paragraphs = otherParagraphs.map((paragraph) =>\n createParagraph(this.editor, paragraph)\n );\n\n tr.insert(tr.selection.$to.pos, paragraphs);\n }\n\n view.dispatch(tr);\n // Prevent Tiptap from dispatching this transaction, because we already did (this is a hack)\n tr.setMeta(\"preventDispatch\", true);\n\n // 6. Show the diff\n (\n this.editor.commands as unknown as AiCommands\n )._showAiToolbarReviewingDiff();\n\n // We moved to the \"reviewing\" phase, so even if `_showAiToolbarReviewingDiff`\n // returns `false` somehow, we still want to return `true`\n return true;\n },\n\n _handleAiToolbarThinkingError: (error: unknown) => () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in \"thinking\" phase, do nothing\n if (currentState.phase !== \"thinking\") {\n return false;\n }\n\n // 2. Unblock the editor\n this.editor.setEditable(true);\n\n // 3. Log the error\n console.error(error);\n\n // 4. Set to \"asking\" phase with error\n this.storage.state = {\n phase: \"asking\",\n initialSelection: currentState.initialSelection,\n // If the custom prompt is different than the prompt, reset it\n customPrompt:\n currentState.prompt === currentState.customPrompt\n ? currentState.customPrompt\n : \"\",\n // Pass the error so it can be displayed\n error:\n error instanceof Error\n ? error\n : new Error(String(error), { cause: error }),\n };\n\n return true;\n },\n\n _updateAiToolbarCustomPrompt:\n (customPrompt: string | ((currentCustomPrompt: string) => string)) =>\n () => {\n const currentState = this.storage.state;\n\n // 1. If NOT in a phase with a custom prompt, do nothing\n if (typeof currentState.customPrompt !== \"string\") {\n return false;\n }\n\n // 2. Update the custom prompt\n this.storage.state.customPrompt =\n typeof customPrompt === \"function\"\n ? customPrompt(currentState.customPrompt)\n : customPrompt;\n\n return true;\n },\n };\n },\n addProseMirrorPlugins() {\n return [\n new Plugin({\n key: AI_TOOLBAR_SELECTION_PLUGIN,\n props: {\n decorations: ({ doc, selection }) => {\n // Don't show the AI toolbar selection if the toolbar is closed or when reviewing diff responses\n if (\n this.storage.state.phase === \"closed\" ||\n (this.storage.state.phase === \"reviewing\" &&\n isContextualPromptDiffResponse(this.storage.state.response))\n ) {\n return DecorationSet.create(doc, []);\n }\n\n const { from, to } = selection;\n const decorations: Decoration[] = [\n Decoration.inline(from, to, {\n class: \"lb-root lb-selection lb-tiptap-active-selection\",\n }),\n ];\n\n return DecorationSet.create(doc, decorations);\n },\n },\n }),\n ];\n },\n});\n"],"names":["takeSnapshot"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AiToolbar.cjs","sources":["../../src/ai/AiToolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n hide,\n limitShift,\n type Middleware,\n offset,\n shift,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n ArrowCornerDownRightIcon,\n Button,\n CheckIcon,\n cn,\n CrossIcon,\n EditIcon,\n LengthenIcon,\n QuestionMarkIcon,\n SendIcon,\n ShortcutTooltip,\n ShortenIcon,\n SparklesIcon,\n SparklesTextIcon,\n StopIcon,\n TooltipProvider,\n UndoIcon,\n useRefs,\n WarningIcon,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport { Command, useCommandState } from \"cmdk\";\nimport type {\n ComponentProps,\n ComponentType,\n KeyboardEvent as ReactKeyboardEvent,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type {\n AiCommands,\n AiExtensionStorage,\n AiToolbarState,\n ChainedAiCommands,\n} from \"../types\";\nimport { getDomRangeFromSelection } from \"../utils\";\nimport { DEFAULT_STATE, isContextualPromptDiffResponse } from \"./AiExtension\";\n\nexport const AI_TOOLBAR_COLLISION_PADDING = 10;\n\nexport interface AiToolbarProps\n extends Omit<ComponentProps<\"div\">, \"value\" | \"defaultValue\" | \"children\"> {\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical offset of the AI toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The prompt suggestions to display below the AI toolbar.\n */\n suggestions?: ReactNode | ComponentType<PropsWithChildren>;\n}\n\ntype AiToolbarDropdownSeparatorProps = ComponentProps<\"div\">;\n\ninterface AiToolbarDropdownItemProps\n extends ComponentProps<typeof Command.Item> {\n icon?: ReactNode;\n}\n\ntype AiToolbarSuggestionsSeparatorProps = AiToolbarDropdownSeparatorProps;\n\ntype AiToolbarSuggestionsLabelProps = ComponentProps<\"span\">;\n\ninterface AiToolbarSuggestionProps extends ComponentProps<\"div\"> {\n prompt?: string;\n icon?: ReactNode;\n}\n\ninterface AiToolbarContext {\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n isDropdownHidden: boolean;\n}\n\nconst AiToolbarContext = createContext<AiToolbarContext | null>(null);\n\nfunction useAiToolbarContext() {\n const context = useContext(AiToolbarContext);\n\n if (!context) {\n throw new Error(\"useAiToolbarContext must be used within an AiToolbar\");\n }\n\n return context;\n}\n\n/**\n * A custom Floating UI middleware to position/scale the toolbar:\n * - Vertically: relative to the reference (e.g. selection)\n * - Horizontally: relative to the editor\n * - Width: relative to the editor\n */\nfunction tiptapFloating(editor: Editor | null): Middleware {\n return {\n name: \"tiptap\",\n options: editor,\n fn({ elements }) {\n if (!editor) {\n return {};\n }\n\n const editorRect = editor.view.dom.getBoundingClientRect();\n\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-width\",\n `${editorRect.width}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-height\",\n `${editorRect.height}px`\n );\n\n return {\n x: editorRect.x,\n };\n },\n };\n}\n\n/**\n * A custom Floating UI middleware to flip the toolbar/dropdown when shifted more than 100%.\n */\nfunction flipToolbar(): Middleware {\n return {\n name: \"flipToolbar\",\n fn({ elements, middlewareData, rects }) {\n const shiftOffsetY = middlewareData.shift?.y ?? 0;\n\n if (Math.abs(shiftOffsetY) >= rects.floating.height) {\n elements.floating.setAttribute(\"data-liveblocks-ai-toolbar-flip\", \"\");\n } else {\n elements.floating.removeAttribute(\"data-liveblocks-ai-toolbar-flip\");\n }\n\n return {};\n },\n };\n}\n\nconst AiToolbarDropdownSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownSeparatorProps\n>(({ className, ...props }, forwardedRef) => {\n return (\n <Command.Separator\n className={cn(\"lb-dropdown-separator\", className)}\n {...props}\n ref={forwardedRef}\n />\n );\n});\n\nconst AiToolbarSuggestionsSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsSeparatorProps\n>((props, forwardedRef) => {\n return <AiToolbarDropdownSeparator ref={forwardedRef} {...props} />;\n});\n\nconst AiToolbarDropdownItem = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownItemProps\n>(({ children, onSelect, icon, className, ...props }, forwardedRef) => {\n return (\n <Command.Item\n className={cn(\"lb-dropdown-item\", className)}\n onSelect={onSelect}\n {...props}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? (\n <span className=\"lb-dropdown-item-label\">{children}</span>\n ) : null}\n </Command.Item>\n );\n});\n\nconst AiToolbarSuggestionsLabel = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsLabelProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <span\n ref={forwardedRef}\n className={cn(\"lb-dropdown-label\", className)}\n {...props}\n >\n {children}\n </span>\n );\n});\n\nconst AiToolbarSuggestion = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionProps\n>(({ prompt: manualPrompt, ...props }, forwardedRef) => {\n const editor = useCurrentEditor(\"Suggestion\", \"AiToolbar\");\n\n const handleSelect = useCallback(\n (prompt: string) => {\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n manualPrompt ?? prompt\n );\n },\n [editor, manualPrompt]\n );\n\n return (\n <AiToolbarDropdownItem\n {...props}\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n});\n\nfunction AiToolbarReviewingSuggestions() {\n const editor = useCurrentEditor(\"ReviewingSuggestions\", \"AiToolbar\");\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n if (isContextualPromptDiffResponse(response)) {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<CheckIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$acceptAiToolbarResponse\n }\n >\n Accept\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking\n }\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands as unknown as AiCommands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n } else {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<ArrowCornerDownRightIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$acceptAiToolbarResponse\n }\n >\n Insert below\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking\n }\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands as unknown as AiCommands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n }\n}\n\nfunction AiToolbarCustomPromptContent() {\n const editor = useCurrentEditor(\"CustomPromptContent\", \"AiToolbar\");\n const aiName = editor.storage.liveblocksAi.name;\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n const { state, dropdownRef, isDropdownHidden } = useAiToolbarContext();\n const { customPrompt } = state as Exclude<\n AiToolbarState,\n { phase: \"closed\" }\n >;\n const isCustomPromptEmpty = useMemo(\n () => customPrompt.trim() === \"\",\n [customPrompt]\n );\n\n useLayoutEffect(\n () => {\n requestAnimationFrame(() => {\n const textArea = textAreaRef.current;\n\n if (!textArea) {\n return;\n }\n\n textArea.focus();\n textArea.setSelectionRange(\n textArea.value.length,\n textArea.value.length\n );\n });\n },\n [] // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handlePromptKeyDown = (\n event: ReactKeyboardEvent<HTMLTextAreaElement>\n ) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.shiftKey) {\n // If the shift key is pressed, add a new line\n (editor.commands as unknown as AiCommands)._updateAiToolbarCustomPrompt(\n (customPrompt) => customPrompt + \"\\n\"\n );\n } else {\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n ) as HTMLElement | null;\n\n if (!isDropdownHidden && selectedDropdownItem) {\n // If there's a selected dropdown item, select it\n selectedDropdownItem.click();\n } else if (!isCustomPromptEmpty) {\n // Otherwise, submit the custom prompt\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }\n }\n }\n };\n\n const handleCustomPromptChange = useCallback(\n (customPrompt: string) => {\n (editor.commands as unknown as AiCommands)._updateAiToolbarCustomPrompt(\n customPrompt\n );\n },\n [editor]\n );\n\n const handleSendClick = useCallback(() => {\n if (isCustomPromptEmpty) {\n return;\n }\n\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }, [editor, customPrompt, isCustomPromptEmpty, state.phase]);\n\n return (\n <div className=\"lb-tiptap-ai-toolbar-content\">\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div\n className=\"lb-tiptap-ai-toolbar-custom-prompt-container\"\n data-value={customPrompt}\n >\n <Command.Input\n value={customPrompt}\n onValueChange={handleCustomPromptChange}\n asChild\n >\n <textarea\n ref={textAreaRef}\n className=\"lb-tiptap-ai-toolbar-custom-prompt\"\n placeholder={`Ask ${aiName} anything…`}\n onKeyDown={handlePromptKeyDown}\n rows={1}\n autoFocus\n />\n </Command.Input>\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content={`Ask ${aiName}`} shortcut=\"Enter\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"primary\"\n aria-label={`Ask ${aiName}`}\n icon={<SendIcon />}\n disabled={isCustomPromptEmpty}\n onClick={handleSendClick}\n />\n </ShortcutTooltip>\n </div>\n </div>\n );\n}\n\nfunction AiToolbarAsking() {\n const { state } = useAiToolbarContext();\n const { error } = state as Exclude<AiToolbarState, { phase: \"closed\" }>;\n\n return (\n <>\n <AiToolbarCustomPromptContent />\n {error ? (\n <div className=\"lb-tiptap-ai-toolbar-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n There was a problem with your request.\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AiToolbarThinking() {\n const editor = useCurrentEditor(\"AiToolbarThinking\", \"AiToolbar\");\n const contentRef = useRef<HTMLDivElement>(null);\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage).name;\n\n const handleAbort = useCallback(() => {\n (editor.commands as unknown as AiCommands).$cancelAiToolbarThinking();\n }, [editor]);\n\n // Focus the toolbar content and clear the current window selection while thinking\n useLayoutEffect(() => {\n contentRef.current?.focus();\n window.getSelection()?.removeAllRanges();\n }, []);\n\n return (\n <>\n <div\n className=\"lb-tiptap-ai-toolbar-content\"\n tabIndex={0}\n ref={contentRef}\n >\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div className=\"lb-tiptap-ai-toolbar-thinking\">\n {aiName} is thinking…\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content=\"Abort response\" shortcut=\"Escape\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"secondary\"\n aria-label=\"Abort response\"\n icon={<StopIcon />}\n onClick={handleAbort}\n />\n </ShortcutTooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction AiToolbarReviewing() {\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n return (\n <>\n {response.type === \"other\" ? (\n <div className=\"lb-tiptap-ai-toolbar-response-container\">\n <div className=\"lb-tiptap-ai-toolbar-response\">{response.text}</div>\n </div>\n ) : null}\n <AiToolbarCustomPromptContent />\n </>\n );\n}\n\nfunction AiToolbarContainer({\n state,\n toolbarRef,\n dropdownRef,\n children,\n}: PropsWithChildren<{\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n}>) {\n const editor = useCurrentEditor(\"AiToolbarContainer\", \"AiToolbar\");\n const customPrompt = state.customPrompt;\n const isCustomPromptMultiline = useMemo(\n () => customPrompt?.includes(\"\\n\"),\n [customPrompt]\n );\n const hasDropdownItems = useCommandState(\n (state) => state.filtered.count > 0\n ) as boolean;\n const isDropdownHidden = isCustomPromptMultiline || !hasDropdownItems;\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (state.phase === \"thinking\") {\n (editor.commands as unknown as AiCommands).$cancelAiToolbarThinking();\n } else {\n (editor.chain() as ChainedAiCommands).$closeAiToolbar().focus().run();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, state.phase]);\n\n return (\n <AiToolbarContext.Provider\n value={{\n state,\n toolbarRef,\n dropdownRef,\n isDropdownHidden,\n }}\n >\n <div className=\"lb-tiptap-ai-toolbar-container\">\n <div className=\"lb-elevation lb-tiptap-ai-toolbar\">\n {state.phase === \"asking\" ? (\n <AiToolbarAsking />\n ) : state.phase === \"thinking\" ? (\n <AiToolbarThinking />\n ) : state.phase === \"reviewing\" ? (\n <AiToolbarReviewing />\n ) : null}\n </div>\n <div\n className=\"lb-tiptap-ai-toolbar-halo\"\n data-active={state.phase === \"thinking\" ? \"\" : undefined}\n aria-hidden\n >\n <div className=\"lb-tiptap-ai-toolbar-halo-horizontal\" />\n <div className=\"lb-tiptap-ai-toolbar-halo-vertical\" />\n </div>\n </div>\n {state.phase === \"asking\" || state.phase === \"reviewing\" ? (\n <Command.List\n className=\"lb-elevation lb-dropdown lb-tiptap-ai-toolbar-dropdown\"\n data-hidden={isDropdownHidden ? \"\" : undefined}\n ref={dropdownRef}\n >\n {state.phase === \"reviewing\" ? (\n <AiToolbarReviewingSuggestions />\n ) : (\n children\n )}\n </Command.List>\n ) : null}\n </AiToolbarContext.Provider>\n );\n}\n\nconst defaultSuggestions = (\n <>\n <AiToolbarSuggestion\n icon={<EditIcon />}\n prompt=\"Improve the quality of the text\"\n >\n Improve writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<CheckIcon />}\n prompt=\"Fix spelling & grammar errors in the text\"\n >\n Fix mistakes\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<ShortenIcon />}\n prompt=\"Shorten the text, simplifying it\"\n >\n Simplify\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<LengthenIcon />}\n prompt=\"Lengthen the text, going into more detail\"\n >\n Add more detail\n </AiToolbarSuggestion>\n <AiToolbarSuggestionsSeparator />\n <AiToolbarSuggestion\n icon={<SparklesTextIcon />}\n prompt=\"Continue writing from the text's end\"\n >\n Continue writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<QuestionMarkIcon />}\n prompt=\"Explain what the text is about\"\n >\n Explain\n </AiToolbarSuggestion>\n </>\n);\n\n/**\n * @beta\n *\n * A floating AI toolbar attached to the editor.\n */\nexport const AiToolbar = Object.assign(\n forwardRef<HTMLDivElement, AiToolbarProps>(\n (\n {\n offset: sideOffset = 6,\n editor,\n className,\n suggestions: Suggestions = defaultSuggestions,\n ...props\n },\n forwardedRef\n ) => {\n const state =\n useEditorState({\n editor,\n selector: (ctx) => {\n return (\n ctx.editor?.storage.liveblocksAi as AiExtensionStorage | undefined\n )?.state;\n },\n }) ?? DEFAULT_STATE;\n const selection = editor?.state.selection;\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: AI_TOOLBAR_COLLISION_PADDING,\n };\n\n return {\n strategy: \"fixed\",\n placement: \"bottom\",\n middleware: [\n tiptapFloating(editor),\n hide(detectOverflowOptions),\n offset(sideOffset),\n shift({\n ...detectOverflowOptions,\n mainAxis: false,\n crossAxis: true,\n limiter: limitShift(),\n }),\n flipToolbar(),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [editor, sideOffset]);\n const isOpen = selection !== undefined && state.phase !== \"closed\";\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n isPositioned,\n } = useFloating({\n ...floatingOptions,\n open: isOpen,\n });\n const toolbarRef = useRef<HTMLDivElement>(null);\n const mergedRefs = useRefs(forwardedRef, toolbarRef, setFloating);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [selectedDropdownValue, setSelectedDropdownValue] = useState(\"\");\n\n // Reset the selected dropdown value when the toolbar is closed\n useEffect(() => {\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n }\n }, [state.phase]);\n\n useEffect(() => {\n // Reset the selected dropdown value when the dropdown is closed\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n\n return;\n }\n\n // Otherwise, make sure a dropdown item is selected when moving between phases\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n );\n\n if (selectedDropdownItem) {\n return;\n }\n\n const firstDropdownItem =\n dropdownRef.current?.querySelector(\"[role='option']\");\n\n setSelectedDropdownValue(\n (firstDropdownItem as HTMLElement | null)?.dataset.value ?? \"\"\n );\n }, [state.phase, dropdownRef, setSelectedDropdownValue]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (!selection && state.phase !== \"closed\") {\n (editor.commands as unknown as AiCommands).$closeAiToolbar();\n }\n }, [state.phase, editor, selection]);\n\n useLayoutEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n setReference(null);\n\n setTimeout(() => {\n if (\n state.phase === \"reviewing\" &&\n isContextualPromptDiffResponse(state.response)\n ) {\n const changes = editor.view.dom.querySelectorAll(\n \"ychange[data-liveblocks]\"\n );\n\n // When diffs are displayed, we manually calculate bounds around all the\n // rendered changes instead of using the selection\n setReference({\n getBoundingClientRect: () => {\n const rects: DOMRect[] = [];\n\n changes.forEach((change) => {\n rects.push(change.getBoundingClientRect());\n });\n\n const minX = Math.min(...rects.map((rect) => rect.left));\n const minY = Math.min(...rects.map((rect) => rect.top));\n const maxX = Math.max(...rects.map((rect) => rect.right));\n const maxY = Math.max(...rects.map((rect) => rect.bottom));\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n top: minY,\n left: minX,\n bottom: maxY,\n right: maxX,\n };\n },\n });\n } else if (selection) {\n const domRange = getDomRangeFromSelection(editor, selection);\n setReference(domRange);\n } else {\n setReference(null);\n }\n }, 0);\n }, [\n selection,\n editor,\n isOpen,\n setReference,\n state.phase,\n state.response,\n ]);\n\n // Close the toolbar when clicking anywhere outside of it\n useEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n const handleOutsideEvent = (event: MouseEvent) => {\n if (!toolbarRef.current) {\n return;\n }\n\n if (\n event.target &&\n !toolbarRef.current.contains(event.target as Node) &&\n (dropdownRef.current\n ? !dropdownRef.current.contains(event.target as Node)\n : true)\n ) {\n (editor.commands as unknown as AiCommands).$closeAiToolbar();\n }\n };\n\n setTimeout(() => {\n document.addEventListener(\"pointerdown\", handleOutsideEvent);\n }, 0);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handleOutsideEvent);\n };\n }, [editor, isOpen]);\n\n if (!editor || !isOpen) {\n return null;\n }\n\n return createPortal(\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <Command\n role=\"toolbar\"\n label=\"AI toolbar\"\n aria-orientation=\"horizontal\"\n className={cn(\n \"lb-root lb-portal lb-tiptap-ai-toolbar-portal\",\n className\n )}\n ref={mergedRefs}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n }}\n value={selectedDropdownValue}\n onValueChange={setSelectedDropdownValue}\n {...props}\n >\n <AiToolbarContainer\n state={state}\n dropdownRef={dropdownRef}\n toolbarRef={toolbarRef}\n >\n {typeof Suggestions === \"function\" ? (\n <Suggestions children={defaultSuggestions} />\n ) : (\n Suggestions\n )}\n </AiToolbarContainer>\n </Command>\n </EditorProvider>\n </TooltipProvider>,\n document.body\n );\n }\n ),\n {\n /**\n * @beta\n *\n * A prompt suggestion displayed in the AI toolbar.\n */\n Suggestion: AiToolbarSuggestion,\n\n /**\n * @beta\n *\n * A label to describe a group of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsLabel: AiToolbarSuggestionsLabel,\n\n /**\n * @beta\n *\n * A separator between groups of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsSeparator: AiToolbarSuggestionsSeparator,\n }\n);\n"],"names":["createContext","useContext","forwardRef","jsx","Command","cn","jsxs","useCurrentEditor","useCallback","isContextualPromptDiffResponse","Fragment","CheckIcon","UndoIcon","CrossIcon","ArrowCornerDownRightIcon","useRef","useMemo","useLayoutEffect","customPrompt","SparklesIcon","ShortcutTooltip","Button","SendIcon","WarningIcon","StopIcon","useCommandState","state","useEffect","EditIcon","ShortenIcon","LengthenIcon","SparklesTextIcon","QuestionMarkIcon","useEditorState","DEFAULT_STATE","hide","offset","shift","limitShift","autoUpdate","useFloating","useRefs","useState","getDomRangeFromSelection","createPortal","TooltipProvider","EditorProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AiToolbar.cjs","sources":["../../src/ai/AiToolbar.tsx"],"sourcesContent":["import {\n autoUpdate,\n type DetectOverflowOptions,\n hide,\n limitShift,\n type Middleware,\n offset,\n shift,\n useFloating,\n type UseFloatingOptions,\n} from \"@floating-ui/react-dom\";\nimport { useLayoutEffect } from \"@liveblocks/react/_private\";\nimport {\n ArrowCornerDownRightIcon,\n Button,\n CheckIcon,\n cn,\n CrossIcon,\n EditIcon,\n LengthenIcon,\n QuestionMarkIcon,\n SendIcon,\n ShortcutTooltip,\n ShortenIcon,\n SparklesIcon,\n SparklesTextIcon,\n StopIcon,\n TooltipProvider,\n UndoIcon,\n useRefs,\n WarningIcon,\n} from \"@liveblocks/react-ui/_private\";\nimport { type Editor, useEditorState } from \"@tiptap/react\";\nimport { Command, useCommandState } from \"cmdk\";\nimport type {\n ComponentProps,\n ComponentType,\n KeyboardEvent as ReactKeyboardEvent,\n PropsWithChildren,\n ReactNode,\n RefObject,\n} from \"react\";\nimport {\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { EditorProvider, useCurrentEditor } from \"../context\";\nimport type {\n AiCommands,\n AiExtensionStorage,\n AiToolbarState,\n ChainedAiCommands,\n} from \"../types\";\nimport { getDomRangeFromSelection } from \"../utils\";\nimport { DEFAULT_STATE, isContextualPromptDiffResponse } from \"./AiExtension\";\n\nexport const AI_TOOLBAR_COLLISION_PADDING = 10;\n\nexport interface AiToolbarProps\n extends Omit<ComponentProps<\"div\">, \"value\" | \"defaultValue\" | \"children\"> {\n /**\n * The Tiptap editor.\n */\n editor: Editor | null;\n\n /**\n * The vertical offset of the AI toolbar from the selection.\n */\n offset?: number;\n\n /**\n * The prompt suggestions to display below the AI toolbar.\n */\n suggestions?: ReactNode | ComponentType<PropsWithChildren>;\n}\n\ntype AiToolbarDropdownSeparatorProps = ComponentProps<\"div\">;\n\ninterface AiToolbarDropdownItemProps\n extends ComponentProps<typeof Command.Item> {\n icon?: ReactNode;\n}\n\ntype AiToolbarSuggestionsSeparatorProps = AiToolbarDropdownSeparatorProps;\n\ntype AiToolbarSuggestionsLabelProps = ComponentProps<\"span\">;\n\ninterface AiToolbarSuggestionProps extends ComponentProps<\"div\"> {\n prompt?: string;\n icon?: ReactNode;\n}\n\ninterface AiToolbarContext {\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n isDropdownHidden: boolean;\n}\n\nconst AiToolbarContext = createContext<AiToolbarContext | null>(null);\n\nfunction useAiToolbarContext() {\n const context = useContext(AiToolbarContext);\n\n if (!context) {\n throw new Error(\"useAiToolbarContext must be used within an AiToolbar\");\n }\n\n return context;\n}\n\n/**\n * A custom Floating UI middleware to position/scale the toolbar:\n * - Vertically: relative to the reference (e.g. selection)\n * - Horizontally: relative to the editor\n * - Width: relative to the editor\n */\nfunction tiptapFloating(editor: Editor | null): Middleware {\n return {\n name: \"tiptap\",\n options: editor,\n fn({ elements }) {\n if (!editor) {\n return {};\n }\n\n const editorRect = editor.view.dom.getBoundingClientRect();\n\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-width\",\n `${editorRect.width}px`\n );\n elements.floating.style.setProperty(\n \"--lb-tiptap-editor-height\",\n `${editorRect.height}px`\n );\n\n return {\n x: editorRect.x,\n };\n },\n };\n}\n\n/**\n * A custom Floating UI middleware to flip the toolbar/dropdown when shifted more than 100%.\n */\nfunction flipToolbar(): Middleware {\n return {\n name: \"flipToolbar\",\n fn({ elements, middlewareData, rects }) {\n const shiftOffsetY = middlewareData.shift?.y ?? 0;\n\n if (Math.abs(shiftOffsetY) >= rects.floating.height) {\n elements.floating.setAttribute(\"data-liveblocks-ai-toolbar-flip\", \"\");\n } else {\n elements.floating.removeAttribute(\"data-liveblocks-ai-toolbar-flip\");\n }\n\n return {};\n },\n };\n}\n\nconst AiToolbarDropdownSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownSeparatorProps\n>(({ className, ...props }, forwardedRef) => {\n return (\n <Command.Separator\n className={cn(\"lb-dropdown-separator\", className)}\n {...props}\n ref={forwardedRef}\n />\n );\n});\n\nconst AiToolbarSuggestionsSeparator = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsSeparatorProps\n>((props, forwardedRef) => {\n return <AiToolbarDropdownSeparator ref={forwardedRef} {...props} />;\n});\n\nconst AiToolbarDropdownItem = forwardRef<\n HTMLDivElement,\n AiToolbarDropdownItemProps\n>(({ children, onSelect, icon, className, ...props }, forwardedRef) => {\n return (\n <Command.Item\n className={cn(\"lb-dropdown-item\", className)}\n onSelect={onSelect}\n {...props}\n ref={forwardedRef}\n >\n {icon ? <span className=\"lb-icon-container\">{icon}</span> : null}\n {children ? (\n <span className=\"lb-dropdown-item-label\">{children}</span>\n ) : null}\n </Command.Item>\n );\n});\n\nconst AiToolbarSuggestionsLabel = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionsLabelProps\n>(({ children, className, ...props }, forwardedRef) => {\n return (\n <span\n ref={forwardedRef}\n className={cn(\"lb-dropdown-label\", className)}\n {...props}\n >\n {children}\n </span>\n );\n});\n\nconst AiToolbarSuggestion = forwardRef<\n HTMLDivElement,\n AiToolbarSuggestionProps\n>(({ prompt: manualPrompt, ...props }, forwardedRef) => {\n const editor = useCurrentEditor(\"Suggestion\", \"AiToolbar\");\n\n const handleSelect = useCallback(\n (prompt: string) => {\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n manualPrompt ?? prompt\n );\n },\n [editor, manualPrompt]\n );\n\n return (\n <AiToolbarDropdownItem\n {...props}\n onSelect={handleSelect}\n ref={forwardedRef}\n />\n );\n});\n\nfunction AiToolbarReviewingSuggestions() {\n const editor = useCurrentEditor(\"ReviewingSuggestions\", \"AiToolbar\");\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n if (isContextualPromptDiffResponse(response)) {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<CheckIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$acceptAiToolbarResponse\n }\n >\n Accept\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking\n }\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands as unknown as AiCommands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n } else {\n return (\n <>\n <AiToolbarDropdownItem\n icon={<ArrowCornerDownRightIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$acceptAiToolbarResponse\n }\n >\n Insert below\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<UndoIcon />}\n onSelect={\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking\n }\n >\n Try again\n </AiToolbarDropdownItem>\n <AiToolbarDropdownItem\n icon={<CrossIcon />}\n onSelect={(editor.commands as unknown as AiCommands).$closeAiToolbar}\n >\n Discard\n </AiToolbarDropdownItem>\n </>\n );\n }\n}\n\nfunction AiToolbarCustomPromptContent() {\n const editor = useCurrentEditor(\"CustomPromptContent\", \"AiToolbar\");\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage).name;\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n const { state, dropdownRef, isDropdownHidden } = useAiToolbarContext();\n const { customPrompt } = state as Exclude<\n AiToolbarState,\n { phase: \"closed\" }\n >;\n const isCustomPromptEmpty = useMemo(\n () => customPrompt.trim() === \"\",\n [customPrompt]\n );\n\n useLayoutEffect(\n () => {\n requestAnimationFrame(() => {\n const textArea = textAreaRef.current;\n\n if (!textArea) {\n return;\n }\n\n textArea.focus();\n textArea.setSelectionRange(\n textArea.value.length,\n textArea.value.length\n );\n });\n },\n [] // eslint-disable-line react-hooks/exhaustive-deps\n );\n\n const handlePromptKeyDown = (\n event: ReactKeyboardEvent<HTMLTextAreaElement>\n ) => {\n if (event.key === \"Enter\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (event.shiftKey) {\n // If the shift key is pressed, add a new line\n (editor.commands as unknown as AiCommands)._updateAiToolbarCustomPrompt(\n (customPrompt) => customPrompt + \"\\n\"\n );\n } else {\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n ) as HTMLElement | null;\n\n if (!isDropdownHidden && selectedDropdownItem) {\n // If there's a selected dropdown item, select it\n selectedDropdownItem.click();\n } else if (!isCustomPromptEmpty) {\n // Otherwise, submit the custom prompt\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }\n }\n }\n };\n\n const handleCustomPromptChange = useCallback(\n (customPrompt: string) => {\n (editor.commands as unknown as AiCommands)._updateAiToolbarCustomPrompt(\n customPrompt\n );\n },\n [editor]\n );\n\n const handleSendClick = useCallback(() => {\n if (isCustomPromptEmpty) {\n return;\n }\n\n (editor.commands as unknown as AiCommands).$startAiToolbarThinking(\n customPrompt,\n state.phase === \"reviewing\"\n );\n }, [editor, customPrompt, isCustomPromptEmpty, state.phase]);\n\n return (\n <div className=\"lb-tiptap-ai-toolbar-content\">\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div\n className=\"lb-tiptap-ai-toolbar-custom-prompt-container\"\n data-value={customPrompt}\n >\n <Command.Input\n value={customPrompt}\n onValueChange={handleCustomPromptChange}\n asChild\n >\n <textarea\n ref={textAreaRef}\n className=\"lb-tiptap-ai-toolbar-custom-prompt\"\n placeholder={`Ask ${aiName} anything…`}\n onKeyDown={handlePromptKeyDown}\n rows={1}\n autoFocus\n />\n </Command.Input>\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content={`Ask ${aiName}`} shortcut=\"Enter\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"primary\"\n aria-label={`Ask ${aiName}`}\n icon={<SendIcon />}\n disabled={isCustomPromptEmpty}\n onClick={handleSendClick}\n />\n </ShortcutTooltip>\n </div>\n </div>\n );\n}\n\nfunction AiToolbarAsking() {\n const { state } = useAiToolbarContext();\n const { error } = state as Exclude<AiToolbarState, { phase: \"closed\" }>;\n\n return (\n <>\n <AiToolbarCustomPromptContent />\n {error ? (\n <div className=\"lb-tiptap-ai-toolbar-error\">\n <span className=\"lb-icon-container\">\n <WarningIcon />\n </span>\n There was a problem with your request.\n </div>\n ) : null}\n </>\n );\n}\n\nfunction AiToolbarThinking() {\n const editor = useCurrentEditor(\"AiToolbarThinking\", \"AiToolbar\");\n const contentRef = useRef<HTMLDivElement>(null);\n const aiName = (editor.storage.liveblocksAi as AiExtensionStorage).name;\n\n const handleAbort = useCallback(() => {\n (editor.commands as unknown as AiCommands).$cancelAiToolbarThinking();\n }, [editor]);\n\n // Focus the toolbar content and clear the current window selection while thinking\n useLayoutEffect(() => {\n contentRef.current?.focus();\n window.getSelection()?.removeAllRanges();\n }, []);\n\n return (\n <>\n <div\n className=\"lb-tiptap-ai-toolbar-content\"\n tabIndex={0}\n ref={contentRef}\n >\n <span className=\"lb-icon-container lb-tiptap-ai-toolbar-icon-container\">\n <SparklesIcon />\n </span>\n <div className=\"lb-tiptap-ai-toolbar-thinking\">\n {aiName} is thinking…\n </div>\n <div className=\"lb-tiptap-ai-toolbar-actions\">\n <ShortcutTooltip content=\"Abort response\" shortcut=\"Escape\">\n <Button\n className=\"lb-tiptap-ai-toolbar-action\"\n variant=\"secondary\"\n aria-label=\"Abort response\"\n icon={<StopIcon />}\n onClick={handleAbort}\n />\n </ShortcutTooltip>\n </div>\n </div>\n </>\n );\n}\n\nfunction AiToolbarReviewing() {\n const { state } = useAiToolbarContext();\n const { response } = state as Extract<AiToolbarState, { phase: \"reviewing\" }>;\n\n return (\n <>\n {response.type === \"other\" ? (\n <div className=\"lb-tiptap-ai-toolbar-response-container\">\n <div className=\"lb-tiptap-ai-toolbar-response\">{response.text}</div>\n </div>\n ) : null}\n <AiToolbarCustomPromptContent />\n </>\n );\n}\n\nfunction AiToolbarContainer({\n state,\n toolbarRef,\n dropdownRef,\n children,\n}: PropsWithChildren<{\n state: AiToolbarState;\n toolbarRef: RefObject<HTMLDivElement>;\n dropdownRef: RefObject<HTMLDivElement>;\n}>) {\n const editor = useCurrentEditor(\"AiToolbarContainer\", \"AiToolbar\");\n const customPrompt = state.customPrompt;\n const isCustomPromptMultiline = useMemo(\n () => customPrompt?.includes(\"\\n\"),\n [customPrompt]\n );\n const hasDropdownItems = useCommandState(\n (state) => state.filtered.count > 0\n ) as boolean;\n const isDropdownHidden = isCustomPromptMultiline || !hasDropdownItems;\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (!event.defaultPrevented && event.key === \"Escape\") {\n event.preventDefault();\n event.stopPropagation();\n\n if (state.phase === \"thinking\") {\n (editor.commands as unknown as AiCommands).$cancelAiToolbarThinking();\n } else {\n (editor.chain() as ChainedAiCommands).$closeAiToolbar().focus().run();\n }\n }\n };\n\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [editor, state.phase]);\n\n return (\n <AiToolbarContext.Provider\n value={{\n state,\n toolbarRef,\n dropdownRef,\n isDropdownHidden,\n }}\n >\n <div className=\"lb-tiptap-ai-toolbar-container\">\n <div className=\"lb-elevation lb-tiptap-ai-toolbar\">\n {state.phase === \"asking\" ? (\n <AiToolbarAsking />\n ) : state.phase === \"thinking\" ? (\n <AiToolbarThinking />\n ) : state.phase === \"reviewing\" ? (\n <AiToolbarReviewing />\n ) : null}\n </div>\n <div\n className=\"lb-tiptap-ai-toolbar-halo\"\n data-active={state.phase === \"thinking\" ? \"\" : undefined}\n aria-hidden\n >\n <div className=\"lb-tiptap-ai-toolbar-halo-horizontal\" />\n <div className=\"lb-tiptap-ai-toolbar-halo-vertical\" />\n </div>\n </div>\n {state.phase === \"asking\" || state.phase === \"reviewing\" ? (\n <Command.List\n className=\"lb-elevation lb-dropdown lb-tiptap-ai-toolbar-dropdown\"\n data-hidden={isDropdownHidden ? \"\" : undefined}\n ref={dropdownRef}\n >\n {state.phase === \"reviewing\" ? (\n <AiToolbarReviewingSuggestions />\n ) : (\n children\n )}\n </Command.List>\n ) : null}\n </AiToolbarContext.Provider>\n );\n}\n\nconst defaultSuggestions = (\n <>\n <AiToolbarSuggestion\n icon={<EditIcon />}\n prompt=\"Improve the quality of the text\"\n >\n Improve writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<CheckIcon />}\n prompt=\"Fix spelling & grammar errors in the text\"\n >\n Fix mistakes\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<ShortenIcon />}\n prompt=\"Shorten the text, simplifying it\"\n >\n Simplify\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<LengthenIcon />}\n prompt=\"Lengthen the text, going into more detail\"\n >\n Add more detail\n </AiToolbarSuggestion>\n <AiToolbarSuggestionsSeparator />\n <AiToolbarSuggestion\n icon={<SparklesTextIcon />}\n prompt=\"Continue writing from the text's end\"\n >\n Continue writing\n </AiToolbarSuggestion>\n <AiToolbarSuggestion\n icon={<QuestionMarkIcon />}\n prompt=\"Explain what the text is about\"\n >\n Explain\n </AiToolbarSuggestion>\n </>\n);\n\n/**\n * @beta\n *\n * A floating AI toolbar attached to the editor.\n */\nexport const AiToolbar = Object.assign(\n forwardRef<HTMLDivElement, AiToolbarProps>(\n (\n {\n offset: sideOffset = 6,\n editor,\n className,\n suggestions: Suggestions = defaultSuggestions,\n ...props\n },\n forwardedRef\n ) => {\n const state =\n useEditorState({\n editor,\n selector: (ctx) => {\n return (\n ctx.editor?.storage.liveblocksAi as AiExtensionStorage | undefined\n )?.state;\n },\n }) ?? DEFAULT_STATE;\n const selection = editor?.state.selection;\n const floatingOptions: UseFloatingOptions = useMemo(() => {\n const detectOverflowOptions: DetectOverflowOptions = {\n padding: AI_TOOLBAR_COLLISION_PADDING,\n };\n\n return {\n strategy: \"fixed\",\n placement: \"bottom\",\n middleware: [\n tiptapFloating(editor),\n hide(detectOverflowOptions),\n offset(sideOffset),\n shift({\n ...detectOverflowOptions,\n mainAxis: false,\n crossAxis: true,\n limiter: limitShift(),\n }),\n flipToolbar(),\n ],\n whileElementsMounted: (...args) => {\n return autoUpdate(...args, {\n animationFrame: true,\n });\n },\n };\n }, [editor, sideOffset]);\n const isOpen = selection !== undefined && state.phase !== \"closed\";\n const {\n refs: { setReference, setFloating },\n strategy,\n x,\n y,\n isPositioned,\n } = useFloating({\n ...floatingOptions,\n open: isOpen,\n });\n const toolbarRef = useRef<HTMLDivElement>(null);\n const mergedRefs = useRefs(forwardedRef, toolbarRef, setFloating);\n const dropdownRef = useRef<HTMLDivElement>(null);\n const [selectedDropdownValue, setSelectedDropdownValue] = useState(\"\");\n\n // Reset the selected dropdown value when the toolbar is closed\n useEffect(() => {\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n }\n }, [state.phase]);\n\n useEffect(() => {\n // Reset the selected dropdown value when the dropdown is closed\n if (state.phase === \"closed\") {\n setSelectedDropdownValue(\"\");\n\n return;\n }\n\n // Otherwise, make sure a dropdown item is selected when moving between phases\n const selectedDropdownItem = dropdownRef.current?.querySelector(\n \"[role='option'][data-selected='true']\"\n );\n\n if (selectedDropdownItem) {\n return;\n }\n\n const firstDropdownItem =\n dropdownRef.current?.querySelector(\"[role='option']\");\n\n setSelectedDropdownValue(\n (firstDropdownItem as HTMLElement | null)?.dataset.value ?? \"\"\n );\n }, [state.phase, dropdownRef, setSelectedDropdownValue]);\n\n useEffect(() => {\n if (!editor) {\n return;\n }\n\n if (!selection && state.phase !== \"closed\") {\n (editor.commands as unknown as AiCommands).$closeAiToolbar();\n }\n }, [state.phase, editor, selection]);\n\n useLayoutEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n setReference(null);\n\n setTimeout(() => {\n if (\n state.phase === \"reviewing\" &&\n isContextualPromptDiffResponse(state.response)\n ) {\n const changes = editor.view.dom.querySelectorAll(\n \"ychange[data-liveblocks]\"\n );\n\n // When diffs are displayed, we manually calculate bounds around all the\n // rendered changes instead of using the selection\n setReference({\n getBoundingClientRect: () => {\n const rects: DOMRect[] = [];\n\n changes.forEach((change) => {\n rects.push(change.getBoundingClientRect());\n });\n\n const minX = Math.min(...rects.map((rect) => rect.left));\n const minY = Math.min(...rects.map((rect) => rect.top));\n const maxX = Math.max(...rects.map((rect) => rect.right));\n const maxY = Math.max(...rects.map((rect) => rect.bottom));\n\n return {\n x: minX,\n y: minY,\n width: maxX - minX,\n height: maxY - minY,\n top: minY,\n left: minX,\n bottom: maxY,\n right: maxX,\n };\n },\n });\n } else if (selection) {\n const domRange = getDomRangeFromSelection(editor, selection);\n setReference(domRange);\n } else {\n setReference(null);\n }\n }, 0);\n }, [\n selection,\n editor,\n isOpen,\n setReference,\n state.phase,\n state.response,\n ]);\n\n // Close the toolbar when clicking anywhere outside of it\n useEffect(() => {\n if (!editor || !isOpen) {\n return;\n }\n\n const handleOutsideEvent = (event: MouseEvent) => {\n if (!toolbarRef.current) {\n return;\n }\n\n if (\n event.target &&\n !toolbarRef.current.contains(event.target as Node) &&\n (dropdownRef.current\n ? !dropdownRef.current.contains(event.target as Node)\n : true)\n ) {\n (editor.commands as unknown as AiCommands).$closeAiToolbar();\n }\n };\n\n setTimeout(() => {\n document.addEventListener(\"pointerdown\", handleOutsideEvent);\n }, 0);\n\n return () => {\n document.removeEventListener(\"pointerdown\", handleOutsideEvent);\n };\n }, [editor, isOpen]);\n\n if (!editor || !isOpen) {\n return null;\n }\n\n return createPortal(\n <TooltipProvider>\n <EditorProvider editor={editor}>\n <Command\n role=\"toolbar\"\n label=\"AI toolbar\"\n aria-orientation=\"horizontal\"\n className={cn(\n \"lb-root lb-portal lb-tiptap-ai-toolbar-portal\",\n className\n )}\n ref={mergedRefs}\n style={{\n position: strategy,\n top: 0,\n left: 0,\n transform: isPositioned\n ? `translate3d(${Math.round(x)}px, ${Math.round(y)}px, 0)`\n : \"translate3d(0, -200%, 0)\",\n }}\n value={selectedDropdownValue}\n onValueChange={setSelectedDropdownValue}\n {...props}\n >\n <AiToolbarContainer\n state={state}\n dropdownRef={dropdownRef}\n toolbarRef={toolbarRef}\n >\n {typeof Suggestions === \"function\" ? (\n <Suggestions children={defaultSuggestions} />\n ) : (\n Suggestions\n )}\n </AiToolbarContainer>\n </Command>\n </EditorProvider>\n </TooltipProvider>,\n document.body\n );\n }\n ),\n {\n /**\n * @beta\n *\n * A prompt suggestion displayed in the AI toolbar.\n */\n Suggestion: AiToolbarSuggestion,\n\n /**\n * @beta\n *\n * A label to describe a group of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsLabel: AiToolbarSuggestionsLabel,\n\n /**\n * @beta\n *\n * A separator between groups of prompt suggestions displayed in the AI toolbar.\n */\n SuggestionsSeparator: AiToolbarSuggestionsSeparator,\n }\n);\n"],"names":["createContext","useContext","forwardRef","jsx","Command","cn","jsxs","useCurrentEditor","useCallback","isContextualPromptDiffResponse","Fragment","CheckIcon","UndoIcon","CrossIcon","ArrowCornerDownRightIcon","useRef","useMemo","useLayoutEffect","customPrompt","SparklesIcon","ShortcutTooltip","Button","SendIcon","WarningIcon","StopIcon","useCommandState","state","useEffect","EditIcon","ShortenIcon","LengthenIcon","SparklesTextIcon","QuestionMarkIcon","useEditorState","DEFAULT_STATE","hide","offset","shift","limitShift","autoUpdate","useFloating","useRefs","useState","getDomRangeFromSelection","createPortal","TooltipProvider","EditorProvider"],"mappings":"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"}
|