payload-richtext-tiptap 0.0.141 → 0.0.143
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/README.md +27 -1
- package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.js +0 -1
- package/dist/src/fields/TiptapEditor/extensions/AICommand/AICommand.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.d.ts +3 -3
- package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.js +47 -41
- package/dist/src/fields/TiptapEditor/extensions/LinkPreview/LinkPreview.js.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.d.ts +4 -2
- package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.js +53 -14
- package/dist/src/fields/TiptapEditor/extensions/serverside/ServersideTiptapBody.js.map +1 -1
- package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.d.ts +2 -2
- package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.js +22 -20
- package/dist/src/fields/TiptapEditor/features/BlockEditor/BlockEditor.js.map +1 -1
- package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.js +2 -4
- package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.js.map +1 -1
- package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.js +4 -6
- package/dist/src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.js.map +1 -1
- package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.d.ts.map +1 -1
- package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.js +3 -5
- package/dist/src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.js.map +1 -1
- package/dist/src/mobile.css +1 -1
- package/dist/src/styles.css +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.js
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
|
-
import { useLocale } from '@payloadcms/ui/providers/Locale';
|
|
3
2
|
import * as Popover from '@radix-ui/react-popover';
|
|
4
3
|
import i18next from 'i18next';
|
|
5
4
|
import { ArrowDownWideNarrow, BookText, CheckCheck, ChevronDown, Languages, RefreshCcwDot, StepForward, WrapText } from 'lucide-react';
|
|
@@ -54,7 +53,6 @@ const options = [
|
|
|
54
53
|
}
|
|
55
54
|
];
|
|
56
55
|
const AISelectorCommands = ({ messages, onSelect, editor })=>{
|
|
57
|
-
const { code } = useLocale();
|
|
58
56
|
const editorSelection = editor?.state?.selection?.content?.()?.content?.toJSON();
|
|
59
57
|
const sortedLanguages = useMemo(()=>{
|
|
60
58
|
const editorLanguage = editor.storage?.aiCommand?.language;
|
|
@@ -138,7 +136,7 @@ const AISelectorCommands = ({ messages, onSelect, editor })=>{
|
|
|
138
136
|
const content = messages ? extractMarkdown(messages) ?? '' : editor.state.doc.textBetween(from, to, ' ');
|
|
139
137
|
onSelect(content, {
|
|
140
138
|
option: option.value,
|
|
141
|
-
language: editor?.storage?.aiCommand?.language
|
|
139
|
+
language: editor?.storage?.aiCommand?.language
|
|
142
140
|
});
|
|
143
141
|
},
|
|
144
142
|
className: " gap-2 px-4 w-full flex justify-start",
|
|
@@ -168,7 +166,7 @@ const AISelectorCommands = ({ messages, onSelect, editor })=>{
|
|
|
168
166
|
});
|
|
169
167
|
onSelect(text, {
|
|
170
168
|
option: 'continue',
|
|
171
|
-
language: editor?.storage?.aiCommand?.language
|
|
169
|
+
language: editor?.storage?.aiCommand?.language
|
|
172
170
|
});
|
|
173
171
|
},
|
|
174
172
|
value: "continue",
|
package/dist/src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.tsx"],"sourcesContent":["import { useLocale } from '@payloadcms/ui/providers/Locale'\nimport * as Popover from '@radix-ui/react-popover'\nimport { Editor, JSONContent } from '@tiptap/react'\nimport i18next from 'i18next'\nimport {\n ArrowDownWideNarrow,\n BookText,\n CheckCheck,\n ChevronDown,\n Languages,\n RefreshCcwDot,\n StepForward,\n WrapText,\n} from 'lucide-react'\nimport { languages } from '../../../../lib/constants.js'\nimport { getPrevText } from '../../../../lib/utils/index.js'\nimport { DropdownCategoryTitle } from '../../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../../ui/Icon.js'\nimport { Surface } from '../../../ui/Surface.js'\nimport { Toolbar } from '../../../ui/Toolbar.js'\nimport { useMemo } from 'react'\nimport { extractMarkdown } from '../../../../lib/extract.js'\nconst options = [\n // {\n // value: 'translate',\n // label: 'Translate text',\n // icon: WrapText,\n // },\n {\n value: 'improve',\n label: 'Improve writing',\n icon: RefreshCcwDot,\n },\n {\n value: 'fix',\n label: 'Fix grammar',\n icon: CheckCheck,\n },\n {\n value: 'rewrite_with_guidelines',\n label: 'Rewrite per Editorial Guidelines',\n icon: BookText,\n },\n {\n value: 'rewrite',\n label: 'Rewrite into Axios',\n icon: WrapText,\n },\n\n {\n value: 'summarize',\n label: 'Summarize text',\n icon: WrapText,\n },\n {\n value: 'shorter',\n label: 'Make shorter',\n icon: ArrowDownWideNarrow,\n },\n {\n value: 'longer',\n label: 'Make longer',\n icon: WrapText,\n },\n]\n\ninterface AISelectorCommandsProps {\n editor: Editor\n messages?: JSONContent\n onSelect: (\n value: string,\n options: { option: string; language?: string; selection?: JSON },\n ) => void\n}\n\nconst AISelectorCommands = ({ messages, onSelect, editor }: AISelectorCommandsProps) => {\n const { code } = useLocale()\n const editorSelection = editor?.state?.selection?.content?.()?.content?.toJSON()\n const sortedLanguages = useMemo(() => {\n const editorLanguage = editor.storage?.aiCommand?.language\n return languages.sort((a, b) => {\n if (editorLanguage?.includes(a.value)) return -1\n if (editorLanguage?.includes(b.value)) return 1\n return 0\n })\n }, [languages, editor.storage?.aiCommand?.language])\n\n return (\n <>\n <DropdownCategoryTitle>Edit or review selection</DropdownCategoryTitle>\n {editorSelection && (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Toolbar.Button\n className='gap-2 px-4 w-full flex justify-start '\n type='button'\n // active={!!states.currentHighlight}\n tooltip={i18next.t('highlightText') || 'Highlight text'}\n >\n <Icon icon={Languages} className='h-4 w-4 text-blue-500' />\n Translate text\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n <Icon icon={ChevronDown} className='h-4 w-4 text-blue-500' />\n </Toolbar.Button>\n </Popover.Trigger>\n <Popover.Content side='right' align='start' sideOffset={8} asChild>\n <Surface className='flex flex-col min-w-[15rem] p-2 max-h-[20rem] overflow-auto'>\n <DropdownCategoryTitle>Languages</DropdownCategoryTitle>\n\n {sortedLanguages.map((lang) => (\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n onSelect('', {\n option: 'translate',\n language: lang.value,\n selection: editorSelection,\n })\n }}\n className='gap-2 px-4 w-full flex justify-start '\n key={lang.value}\n >\n {lang.label}\n </Toolbar.Button>\n ))}\n </Surface>\n </Popover.Content>\n </Popover.Root>\n )}\n\n {options.map((option) => (\n <Toolbar.Button\n // onSelect={(value) => {\n // const slice = editor.state.selection.content()\n // const text = editor?.storage?.markdown?.serializer.serialize(slice.content)\n // onSelect(text, option.value)\n // }}\n onClick={() => {\n const { from, to, empty } = editor.state.selection\n const editorSelection = editor.state.selection.content().content.toJSON()\n const content = messages\n ? (extractMarkdown(messages) ?? '')\n : editor.state.doc.textBetween(from, to, ' ')\n onSelect(content, {\n option: option.value,\n language: editor?.storage?.aiCommand?.language ?? code ?? 'en',\n })\n }}\n className=' gap-2 px-4 w-full flex justify-start'\n key={option.value}\n value={option.value}\n >\n <option.icon className='h-4 w-4 text-blue-500' />\n {option.label}\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n ))}\n <Toolbar.Divider horizontal />\n <DropdownCategoryTitle>Use AI to do more</DropdownCategoryTitle>\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n const text = messages\n ? (extractMarkdown(messages) ?? '')\n : getPrevText(editor, { chars: 5000 })\n onSelect(text, {\n option: 'continue',\n language: editor?.storage?.aiCommand?.language ?? code ?? 'en',\n })\n }}\n value='continue'\n className='gap-2 px-4 w-full flex justify-start'\n >\n <StepForward className='h-4 w-4 text-blue-500' />\n Continue writing\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n </>\n )\n}\n\nexport default AISelectorCommands\n"],"names":["useLocale","Popover","i18next","ArrowDownWideNarrow","BookText","CheckCheck","ChevronDown","Languages","RefreshCcwDot","StepForward","WrapText","languages","getPrevText","DropdownCategoryTitle","Icon","Surface","Toolbar","useMemo","extractMarkdown","options","value","label","icon","AISelectorCommands","messages","onSelect","editor","code","editorSelection","state","selection","content","toJSON","sortedLanguages","editorLanguage","storage","aiCommand","language","sort","a","b","includes","Root","Trigger","asChild","Button","className","type","tooltip","t","span","Content","side","align","sideOffset","map","lang","onClick","option","from","to","empty","doc","textBetween","Divider","horizontal","text","chars"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../src/fields/TiptapEditor/features/menus/TextMenu/components/ai-selector-commands.tsx"],"sourcesContent":["import * as Popover from '@radix-ui/react-popover'\nimport { Editor, JSONContent } from '@tiptap/react'\nimport i18next from 'i18next'\nimport {\n ArrowDownWideNarrow,\n BookText,\n CheckCheck,\n ChevronDown,\n Languages,\n RefreshCcwDot,\n StepForward,\n WrapText,\n} from 'lucide-react'\nimport { languages } from '../../../../lib/constants.js'\nimport { getPrevText } from '../../../../lib/utils/index.js'\nimport { DropdownCategoryTitle } from '../../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../../ui/Icon.js'\nimport { Surface } from '../../../ui/Surface.js'\nimport { Toolbar } from '../../../ui/Toolbar.js'\nimport { useMemo } from 'react'\nimport { extractMarkdown } from '../../../../lib/extract.js'\nconst options = [\n // {\n // value: 'translate',\n // label: 'Translate text',\n // icon: WrapText,\n // },\n {\n value: 'improve',\n label: 'Improve writing',\n icon: RefreshCcwDot,\n },\n {\n value: 'fix',\n label: 'Fix grammar',\n icon: CheckCheck,\n },\n {\n value: 'rewrite_with_guidelines',\n label: 'Rewrite per Editorial Guidelines',\n icon: BookText,\n },\n {\n value: 'rewrite',\n label: 'Rewrite into Axios',\n icon: WrapText,\n },\n\n {\n value: 'summarize',\n label: 'Summarize text',\n icon: WrapText,\n },\n {\n value: 'shorter',\n label: 'Make shorter',\n icon: ArrowDownWideNarrow,\n },\n {\n value: 'longer',\n label: 'Make longer',\n icon: WrapText,\n },\n]\n\ninterface AISelectorCommandsProps {\n editor: Editor\n messages?: JSONContent\n onSelect: (\n value: string,\n options: { option: string; language?: string; selection?: JSON },\n ) => void\n}\n\nconst AISelectorCommands = ({ messages, onSelect, editor }: AISelectorCommandsProps) => {\n const editorSelection = editor?.state?.selection?.content?.()?.content?.toJSON()\n const sortedLanguages = useMemo(() => {\n const editorLanguage = editor.storage?.aiCommand?.language\n return languages.sort((a, b) => {\n if (editorLanguage?.includes(a.value)) return -1\n if (editorLanguage?.includes(b.value)) return 1\n return 0\n })\n }, [languages, editor.storage?.aiCommand?.language])\n\n return (\n <>\n <DropdownCategoryTitle>Edit or review selection</DropdownCategoryTitle>\n {editorSelection && (\n <Popover.Root>\n <Popover.Trigger asChild>\n <Toolbar.Button\n className='gap-2 px-4 w-full flex justify-start '\n type='button'\n // active={!!states.currentHighlight}\n tooltip={i18next.t('highlightText') || 'Highlight text'}\n >\n <Icon icon={Languages} className='h-4 w-4 text-blue-500' />\n Translate text\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n <Icon icon={ChevronDown} className='h-4 w-4 text-blue-500' />\n </Toolbar.Button>\n </Popover.Trigger>\n <Popover.Content side='right' align='start' sideOffset={8} asChild>\n <Surface className='flex flex-col min-w-[15rem] p-2 max-h-[20rem] overflow-auto'>\n <DropdownCategoryTitle>Languages</DropdownCategoryTitle>\n\n {sortedLanguages.map((lang) => (\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n onSelect('', {\n option: 'translate',\n language: lang.value,\n selection: editorSelection,\n })\n }}\n className='gap-2 px-4 w-full flex justify-start '\n key={lang.value}\n >\n {lang.label}\n </Toolbar.Button>\n ))}\n </Surface>\n </Popover.Content>\n </Popover.Root>\n )}\n\n {options.map((option) => (\n <Toolbar.Button\n // onSelect={(value) => {\n // const slice = editor.state.selection.content()\n // const text = editor?.storage?.markdown?.serializer.serialize(slice.content)\n // onSelect(text, option.value)\n // }}\n onClick={() => {\n const { from, to, empty } = editor.state.selection\n const editorSelection = editor.state.selection.content().content.toJSON()\n const content = messages\n ? (extractMarkdown(messages) ?? '')\n : editor.state.doc.textBetween(from, to, ' ')\n onSelect(content, {\n option: option.value,\n language: editor?.storage?.aiCommand?.language,\n })\n }}\n className=' gap-2 px-4 w-full flex justify-start'\n key={option.value}\n value={option.value}\n >\n <option.icon className='h-4 w-4 text-blue-500' />\n {option.label}\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n ))}\n <Toolbar.Divider horizontal />\n <DropdownCategoryTitle>Use AI to do more</DropdownCategoryTitle>\n <Toolbar.Button\n onClick={() => {\n const editorSelection = editor.state.selection.content().content.toJSON()\n\n const text = messages\n ? (extractMarkdown(messages) ?? '')\n : getPrevText(editor, { chars: 5000 })\n onSelect(text, {\n option: 'continue',\n language: editor?.storage?.aiCommand?.language,\n })\n }}\n value='continue'\n className='gap-2 px-4 w-full flex justify-start'\n >\n <StepForward className='h-4 w-4 text-blue-500' />\n Continue writing\n <span className='text-xs ml-1 px-2 py-0.5 bg-blue-100 text-blue-700 rounded-full dark:bg-blue-700 dark:text-blue-100 align-baseline'>\n Beta\n </span>\n </Toolbar.Button>\n </>\n )\n}\n\nexport default AISelectorCommands\n"],"names":["Popover","i18next","ArrowDownWideNarrow","BookText","CheckCheck","ChevronDown","Languages","RefreshCcwDot","StepForward","WrapText","languages","getPrevText","DropdownCategoryTitle","Icon","Surface","Toolbar","useMemo","extractMarkdown","options","value","label","icon","AISelectorCommands","messages","onSelect","editor","editorSelection","state","selection","content","toJSON","sortedLanguages","editorLanguage","storage","aiCommand","language","sort","a","b","includes","Root","Trigger","asChild","Button","className","type","tooltip","t","span","Content","side","align","sideOffset","map","lang","onClick","option","from","to","empty","doc","textBetween","Divider","horizontal","text","chars"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AICommandPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAA;
|
|
1
|
+
{"version":3,"file":"AICommandPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,KAON,MAAM,OAAO,CAAA;AAId,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAItC,OAAO,EAAW,KAAK,EAAE,MAAM,wCAAwC,CAAA;AAYvE,MAAM,MAAM,mBAAmB,GAAG;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IACtC,KAAK,EAAE,KAAK,EAAE,CAAA;CACf,CAAA;AAED,eAAO,MAAM,cAAc,qFA6Q1B,CAAA"}
|
|
@@ -4,7 +4,6 @@ import { ArrowUpCircle, Sparkles } from 'lucide-react';
|
|
|
4
4
|
import React, { forwardRef, useCallback, useEffect, useImperativeHandle, useRef, useState } from 'react';
|
|
5
5
|
import Markdown from 'react-markdown';
|
|
6
6
|
import TextareaAutosize from 'react-textarea-autosize';
|
|
7
|
-
import { useLocale } from '@payloadcms/ui/providers/Locale';
|
|
8
7
|
import { experimental_useObject as useObject } from '@ai-sdk/react';
|
|
9
8
|
import i18next from 'i18next';
|
|
10
9
|
import { TiptapSchema } from '../../../lib/tiptapSchema.js';
|
|
@@ -18,7 +17,6 @@ import { Toolbar } from '../../ui/Toolbar.js';
|
|
|
18
17
|
import { useExtractMarkdown } from '../AIEditorPanel/markdown.hook.js';
|
|
19
18
|
export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange, userPrompt, items, ...restProps }, ref)=>{
|
|
20
19
|
const [inputValue, setInputValue] = useState(userPrompt ?? '');
|
|
21
|
-
const { code } = useLocale();
|
|
22
20
|
const { view } = editor;
|
|
23
21
|
const scrollContainer = useRef(null);
|
|
24
22
|
const activeItem = useRef(null);
|
|
@@ -40,7 +38,7 @@ export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange,
|
|
|
40
38
|
body: {
|
|
41
39
|
option: 'zap',
|
|
42
40
|
command: inputValue,
|
|
43
|
-
language:
|
|
41
|
+
language: editor?.storage?.aiCommand?.language,
|
|
44
42
|
selection: object
|
|
45
43
|
}
|
|
46
44
|
});
|
|
@@ -52,12 +50,12 @@ export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange,
|
|
|
52
50
|
body: {
|
|
53
51
|
option: 'zap',
|
|
54
52
|
command: inputValue,
|
|
55
|
-
language:
|
|
53
|
+
language: editor?.storage?.aiCommand?.language
|
|
56
54
|
}
|
|
57
55
|
});
|
|
58
56
|
setInputValue('');
|
|
59
57
|
}, [
|
|
60
|
-
|
|
58
|
+
editor?.storage?.aiCommand?.language,
|
|
61
59
|
inputValue,
|
|
62
60
|
object,
|
|
63
61
|
submit
|
|
@@ -241,7 +239,7 @@ export const AICommandPanel = /*#__PURE__*/ forwardRef(({ editor, onOpenChange,
|
|
|
241
239
|
prompt: value,
|
|
242
240
|
body: {
|
|
243
241
|
...options,
|
|
244
|
-
source:
|
|
242
|
+
source: editor?.storage?.aiCommand?.language
|
|
245
243
|
}
|
|
246
244
|
});
|
|
247
245
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"sourcesContent":["'use client'\nimport { ArrowUpCircle, Sparkles } from 'lucide-react'\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\nimport Markdown from 'react-markdown'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { useLocale } from '@payloadcms/ui/providers/Locale'\nimport { Editor } from '@tiptap/react'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport { Command, Group } from '../../../extensions/AICommand/types.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { DropdownButton } from '../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../ui/Icon.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport { useExtractMarkdown } from '../AIEditorPanel/markdown.hook.js'\n\nexport type AICommandPanelProps = {\n editor: Editor\n userPrompt?: string\n onOpenChange: (value: boolean) => void\n items: Group[]\n}\n\nexport const AICommandPanel = forwardRef(\n ({ editor, onOpenChange, userPrompt, items, ...restProps }: AICommandPanelProps, ref) => {\n const [inputValue, setInputValue] = useState(userPrompt ?? '')\n const { code } = useLocale()\n const { view } = editor\n const scrollContainer = useRef<HTMLDivElement>(null)\n const activeItem = useRef<HTMLButtonElement>(null)\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0)\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0)\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n\n const { markdown } = useExtractMarkdown(object)\n\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: '',\n body: { option: 'zap', command: inputValue, language: code ?? 'en', selection: object },\n })\n setInputValue('')\n return\n }\n\n submit({\n prompt: '',\n body: { option: 'zap', command: inputValue, language: code ?? 'en' },\n })\n setInputValue('')\n }, [code, inputValue, object, submit])\n\n useEffect(() => {\n if (userPrompt) setInputValue(userPrompt)\n }, [userPrompt])\n useEffect(() => {\n if (hasCompletion) {\n editor.storage.aiCommand.completion = object\n }\n }, [object, isLoading])\n\n useEffect(() => {\n setSelectedGroupIndex(0)\n setSelectedCommandIndex(0)\n }, [items])\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const command = items[groupIndex].commands[commandIndex]\n setInputValue(command.action(editor))\n },\n [items, editor],\n )\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === 'ArrowDown') {\n if (!items.length) {\n return false\n }\n\n const commands = items[selectedGroupIndex].commands\n\n let newCommandIndex = selectedCommandIndex + 1\n let newGroupIndex = selectedGroupIndex\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0\n newGroupIndex = selectedGroupIndex + 1\n }\n\n if (items.length - 1 < newGroupIndex) {\n newGroupIndex = 0\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'ArrowUp') {\n if (!items.length) {\n return false\n }\n\n let newCommandIndex = selectedCommandIndex - 1\n let newGroupIndex = selectedGroupIndex\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1\n newCommandIndex = items[newGroupIndex]?.commands.length - 1 || 0\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = items.length - 1\n newCommandIndex = items[newGroupIndex].commands.length - 1\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'Enter') {\n if (!items.length || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex)\n\n return true\n }\n\n return false\n },\n }))\n\n useEffect(() => {\n if (activeItem.current && scrollContainer.current) {\n const offsetTop = activeItem.current.offsetTop\n const offsetHeight = activeItem.current.offsetHeight\n\n scrollContainer.current.scrollTop = offsetTop - offsetHeight\n }\n }, [selectedCommandIndex, selectedGroupIndex])\n\n const createCommandClickHandler = useCallback(\n (groupIndex: number, commandIndex: number) => {\n return () => {\n selectItem(groupIndex, commandIndex)\n }\n },\n [selectItem],\n )\n\n return (\n <>\n <Surface\n className={`p-2 min-w-[20rem] flex flex-col gap-2 w-full ${\n hasCompletion ? '-mt-72' : ''\n }`}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div\n className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'\n style={{\n width: boundigClient?.width,\n }}\n >\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center '>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n style={{ resize: 'none' }}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none outline-none border-0 '\n value={inputValue}\n onChange={(e) => {\n editor.storage.aiCommand.userPrompt = e.target.value\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowUpCircle />\n </Toolbar.Button>\n </div>\n </>\n )}\n </>\n </Surface>\n {!isLoading && (\n <Surface\n ref={scrollContainer}\n className='text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-2'\n >\n <div className='grid grid-cols-1 gap-0.5'>\n {hasCompletion ? (\n <AISelectorCommands\n editor={editor}\n messages={object}\n onSelect={(value, options) => {\n if (options?.option === 'translate') {\n submit({ prompt: value, body: options })\n } else {\n submit({ prompt: value, body: { ...options, source: code } })\n }\n }}\n />\n ) : (\n items.map((group, groupIndex: number) => (\n <React.Fragment key={`${group.title}-wrapper`}>\n <div\n className='text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-4 font-semibold tracking-wider select-none uppercase first:mt-0.5'\n key={`${group.title}`}\n >\n {group.title}\n </div>\n {group.commands.map((command: Command, commandIndex: number) => (\n <DropdownButton\n key={`${command.label}`}\n isActive={\n selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex\n }\n onClick={createCommandClickHandler(groupIndex, commandIndex)}\n >\n <Icon icon={command.icon} className='mr-1' />\n {command.label}\n </DropdownButton>\n ))}\n </React.Fragment>\n ))\n )}\n </div>\n </Surface>\n )}\n </>\n )\n },\n)\n"],"names":["ArrowUpCircle","Sparkles","React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","Markdown","TextareaAutosize","useLocale","experimental_useObject","useObject","i18next","TiptapSchema","AISelectorCommands","CrazySpinner","DropdownButton","Icon","ScrollArea","Surface","Toolbar","useExtractMarkdown","AICommandPanel","editor","onOpenChange","userPrompt","items","restProps","ref","inputValue","setInputValue","code","view","scrollContainer","activeItem","selectedGroupIndex","setSelectedGroupIndex","selectedCommandIndex","setSelectedCommandIndex","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","markdown","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","selection","storage","aiCommand","completion","selectItem","groupIndex","commandIndex","commands","action","onKeyDown","event","key","length","newCommandIndex","newGroupIndex","current","offsetTop","offsetHeight","scrollTop","createCommandClickHandler","className","style","width","div","dir","resize","value","onChange","e","target","placeholder","t","autoFocus","Button","onClick","messages","onSelect","options","source","map","group","Fragment","title","isActive","icon","label"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AICommandPanel/AICommandPanel.tsx"],"sourcesContent":["'use client'\nimport { ArrowUpCircle, Sparkles } from 'lucide-react'\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from 'react'\nimport Markdown from 'react-markdown'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { Editor } from '@tiptap/react'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport { Command, Group } from '../../../extensions/AICommand/types.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { DropdownButton } from '../../ui/Dropdown/Dropdown.js'\nimport { Icon } from '../../ui/Icon.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport { useExtractMarkdown } from '../AIEditorPanel/markdown.hook.js'\n\nexport type AICommandPanelProps = {\n editor: Editor\n userPrompt?: string\n onOpenChange: (value: boolean) => void\n items: Group[]\n}\n\nexport const AICommandPanel = forwardRef(\n ({ editor, onOpenChange, userPrompt, items, ...restProps }: AICommandPanelProps, ref) => {\n const [inputValue, setInputValue] = useState(userPrompt ?? '')\n const { view } = editor\n const scrollContainer = useRef<HTMLDivElement>(null)\n const activeItem = useRef<HTMLButtonElement>(null)\n const [selectedGroupIndex, setSelectedGroupIndex] = useState(0)\n const [selectedCommandIndex, setSelectedCommandIndex] = useState(0)\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n\n const { markdown } = useExtractMarkdown(object)\n\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: '',\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n selection: object,\n },\n })\n setInputValue('')\n return\n }\n\n submit({\n prompt: '',\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n },\n })\n setInputValue('')\n }, [editor?.storage?.aiCommand?.language, inputValue, object, submit])\n\n useEffect(() => {\n if (userPrompt) setInputValue(userPrompt)\n }, [userPrompt])\n useEffect(() => {\n if (hasCompletion) {\n editor.storage.aiCommand.completion = object\n }\n }, [object, isLoading])\n\n useEffect(() => {\n setSelectedGroupIndex(0)\n setSelectedCommandIndex(0)\n }, [items])\n\n const selectItem = useCallback(\n (groupIndex: number, commandIndex: number) => {\n const command = items[groupIndex].commands[commandIndex]\n setInputValue(command.action(editor))\n },\n [items, editor],\n )\n\n useImperativeHandle(ref, () => ({\n onKeyDown: ({ event }: { event: React.KeyboardEvent }) => {\n if (event.key === 'ArrowDown') {\n if (!items.length) {\n return false\n }\n\n const commands = items[selectedGroupIndex].commands\n\n let newCommandIndex = selectedCommandIndex + 1\n let newGroupIndex = selectedGroupIndex\n\n if (commands.length - 1 < newCommandIndex) {\n newCommandIndex = 0\n newGroupIndex = selectedGroupIndex + 1\n }\n\n if (items.length - 1 < newGroupIndex) {\n newGroupIndex = 0\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'ArrowUp') {\n if (!items.length) {\n return false\n }\n\n let newCommandIndex = selectedCommandIndex - 1\n let newGroupIndex = selectedGroupIndex\n\n if (newCommandIndex < 0) {\n newGroupIndex = selectedGroupIndex - 1\n newCommandIndex = items[newGroupIndex]?.commands.length - 1 || 0\n }\n\n if (newGroupIndex < 0) {\n newGroupIndex = items.length - 1\n newCommandIndex = items[newGroupIndex].commands.length - 1\n }\n\n setSelectedCommandIndex(newCommandIndex)\n setSelectedGroupIndex(newGroupIndex)\n\n return true\n }\n\n if (event.key === 'Enter') {\n if (!items.length || selectedGroupIndex === -1 || selectedCommandIndex === -1) {\n return false\n }\n\n selectItem(selectedGroupIndex, selectedCommandIndex)\n\n return true\n }\n\n return false\n },\n }))\n\n useEffect(() => {\n if (activeItem.current && scrollContainer.current) {\n const offsetTop = activeItem.current.offsetTop\n const offsetHeight = activeItem.current.offsetHeight\n\n scrollContainer.current.scrollTop = offsetTop - offsetHeight\n }\n }, [selectedCommandIndex, selectedGroupIndex])\n\n const createCommandClickHandler = useCallback(\n (groupIndex: number, commandIndex: number) => {\n return () => {\n selectItem(groupIndex, commandIndex)\n }\n },\n [selectItem],\n )\n\n return (\n <>\n <Surface\n className={`p-2 min-w-[20rem] flex flex-col gap-2 w-full ${\n hasCompletion ? '-mt-72' : ''\n }`}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div\n className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'\n style={{\n width: boundigClient?.width,\n }}\n >\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center '>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n style={{ resize: 'none' }}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none outline-none border-0 '\n value={inputValue}\n onChange={(e) => {\n editor.storage.aiCommand.userPrompt = e.target.value\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowUpCircle />\n </Toolbar.Button>\n </div>\n </>\n )}\n </>\n </Surface>\n {!isLoading && (\n <Surface\n ref={scrollContainer}\n className='text-black max-h-[min(80vh,24rem)] overflow-auto flex-wrap mb-8 p-2'\n >\n <div className='grid grid-cols-1 gap-0.5'>\n {hasCompletion ? (\n <AISelectorCommands\n editor={editor}\n messages={object}\n onSelect={(value, options) => {\n if (options?.option === 'translate') {\n submit({ prompt: value, body: options })\n } else {\n submit({\n prompt: value,\n body: { ...options, source: editor?.storage?.aiCommand?.language },\n })\n }\n }}\n />\n ) : (\n items.map((group, groupIndex: number) => (\n <React.Fragment key={`${group.title}-wrapper`}>\n <div\n className='text-neutral-500 text-[0.65rem] col-[1/-1] mx-2 mt-4 font-semibold tracking-wider select-none uppercase first:mt-0.5'\n key={`${group.title}`}\n >\n {group.title}\n </div>\n {group.commands.map((command: Command, commandIndex: number) => (\n <DropdownButton\n key={`${command.label}`}\n isActive={\n selectedGroupIndex === groupIndex && selectedCommandIndex === commandIndex\n }\n onClick={createCommandClickHandler(groupIndex, commandIndex)}\n >\n <Icon icon={command.icon} className='mr-1' />\n {command.label}\n </DropdownButton>\n ))}\n </React.Fragment>\n ))\n )}\n </div>\n </Surface>\n )}\n </>\n )\n },\n)\n"],"names":["ArrowUpCircle","Sparkles","React","forwardRef","useCallback","useEffect","useImperativeHandle","useRef","useState","Markdown","TextareaAutosize","experimental_useObject","useObject","i18next","TiptapSchema","AISelectorCommands","CrazySpinner","DropdownButton","Icon","ScrollArea","Surface","Toolbar","useExtractMarkdown","AICommandPanel","editor","onOpenChange","userPrompt","items","restProps","ref","inputValue","setInputValue","view","scrollContainer","activeItem","selectedGroupIndex","setSelectedGroupIndex","selectedCommandIndex","setSelectedCommandIndex","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","markdown","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","storage","aiCommand","selection","completion","selectItem","groupIndex","commandIndex","commands","action","onKeyDown","event","key","length","newCommandIndex","newGroupIndex","current","offsetTop","offsetHeight","scrollTop","createCommandClickHandler","className","style","width","div","dir","resize","value","onChange","e","target","placeholder","t","autoFocus","Button","onClick","messages","onSelect","options","source","map","group","Fragment","title","isActive","icon","label"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AIEditorPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"AIEditorPanel.d.ts","sourceRoot":"","sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AAmBtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;CACvC,CAAA;AAED,eAAO,MAAM,aAAa,6BAA8B,kBAAkB,gCAqHzE,CAAA"}
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
3
|
-
import { useLocale } from '@payloadcms/ui/providers/Locale';
|
|
4
3
|
import { ArrowRight, Sparkles } from 'lucide-react';
|
|
5
4
|
import { useCallback, useRef, useState } from 'react';
|
|
6
5
|
import TextareaAutosize from 'react-textarea-autosize';
|
|
@@ -18,7 +17,6 @@ import { ScrollArea } from '../../ui/scroll-area.js';
|
|
|
18
17
|
import { useExtractMarkdown } from './markdown.hook.js';
|
|
19
18
|
export const AIEditorPanel = ({ editor, onOpenChange })=>{
|
|
20
19
|
const [inputValue, setInputValue] = useState('');
|
|
21
|
-
const { code } = useLocale();
|
|
22
20
|
const { view } = editor;
|
|
23
21
|
const editorNode = view.dom;
|
|
24
22
|
const boundigClient = editorNode.getBoundingClientRect();
|
|
@@ -35,7 +33,7 @@ export const AIEditorPanel = ({ editor, onOpenChange })=>{
|
|
|
35
33
|
body: {
|
|
36
34
|
option: 'zap',
|
|
37
35
|
command: inputValue,
|
|
38
|
-
language:
|
|
36
|
+
language: editor?.storage?.aiCommand?.language
|
|
39
37
|
}
|
|
40
38
|
});
|
|
41
39
|
setInputValue('');
|
|
@@ -49,12 +47,12 @@ export const AIEditorPanel = ({ editor, onOpenChange })=>{
|
|
|
49
47
|
body: {
|
|
50
48
|
option: 'zap',
|
|
51
49
|
command: inputValue,
|
|
52
|
-
language:
|
|
50
|
+
language: editor?.storage?.aiCommand?.language
|
|
53
51
|
}
|
|
54
52
|
});
|
|
55
53
|
setInputValue('');
|
|
56
54
|
}, [
|
|
57
|
-
|
|
55
|
+
editor?.storage?.aiCommand?.language,
|
|
58
56
|
inputValue,
|
|
59
57
|
object,
|
|
60
58
|
submit
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"sourcesContent":["'use client'\n\nimport {
|
|
1
|
+
{"version":3,"sources":["../../../../../../../src/fields/TiptapEditor/features/panels/AIEditorPanel/AIEditorPanel.tsx"],"sourcesContent":["'use client'\n\nimport { Editor } from '@tiptap/react'\nimport { ArrowRight, Sparkles } from 'lucide-react'\nimport { useCallback, useEffect, useRef, useState } from 'react'\nimport TextareaAutosize from 'react-textarea-autosize'\n\nimport { experimental_useObject as useObject } from '@ai-sdk/react'\nimport i18next from 'i18next'\nimport Markdown from 'react-markdown'\nimport { extractMarkdown } from '../../../lib/extract.js'\nimport { TiptapSchema } from '../../../lib/tiptapSchema.js'\nimport { getPrevText } from '../../../lib/utils/index.js'\nimport AICompletionCommands from '../../menus/TextMenu/components/ai-completion-command.js'\nimport AISelectorCommands from '../../menus/TextMenu/components/ai-selector-commands.js'\nimport { Surface } from '../../ui/Surface.js'\nimport { Toolbar } from '../../ui/Toolbar.js'\nimport CrazySpinner from '../../ui/crazy-spinner.js'\nimport { ScrollArea } from '../../ui/scroll-area.js'\nimport { useExtractMarkdown } from './markdown.hook.js'\n\nexport type AIEditorPanelProps = {\n editor: Editor\n onOpenChange: (value: boolean) => void\n}\n\nexport const AIEditorPanel = ({ editor, onOpenChange }: AIEditorPanelProps) => {\n const [inputValue, setInputValue] = useState('')\n const { view } = editor\n\n const editorNode = view.dom as HTMLElement\n const boundigClient = editorNode.getBoundingClientRect()\n const inputRef = useRef<HTMLTextAreaElement>(null)\n\n const { object, submit, isLoading } = useObject({\n api: '/api/generate',\n schema: TiptapSchema,\n })\n const hasCompletion = Boolean(object)\n\n const handleClick = useCallback(() => {\n if (object) {\n submit({\n prompt: object,\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n },\n })\n setInputValue('')\n return\n }\n const text = getPrevText(editor, { chars: 5000 })\n\n submit({\n prompt: text,\n body: {\n option: 'zap',\n command: inputValue,\n language: editor?.storage?.aiCommand?.language,\n },\n })\n setInputValue('')\n }, [editor?.storage?.aiCommand?.language, inputValue, object, submit])\n\n const { markdown } = useExtractMarkdown(object)\n return (\n <Surface\n className={`p-2 min-w-[20rem] `}\n style={{\n width: boundigClient?.width,\n }}\n >\n <>\n {markdown && (\n <div className='flex w-full'>\n <ScrollArea>\n <div className='prose p-2 px-4 prose-sm' dir={i18next.dir()}>\n <Markdown>{markdown}</Markdown>\n </div>\n </ScrollArea>\n </div>\n )}\n\n {isLoading && (\n <div className='flex h-12 w-full items-center px-4 text-sm font-medium text-muted-foreground text-blue-500'>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 ' />\n AI (Beta) is thinking\n <div className='ml-2 mt-1'>\n <CrazySpinner />\n </div>\n </div>\n )}\n\n {!isLoading && (\n <>\n <div className='flex justify-between items-center'>\n <Sparkles className='mr-2 h-4 w-4 shrink-0 text-blue-500 ' />\n <TextareaAutosize\n ref={inputRef}\n className='w-full p-2 text-black bg-white rounded dark:bg-black dark:text-white focus:outline-none'\n value={inputValue}\n onChange={(e) => {\n setInputValue(e.target.value)\n }}\n placeholder={\n hasCompletion\n ? i18next.t('tellAiPlaceholder') || 'Tell AI (Beta) what to do next'\n : i18next.t('askAiPlaceholder') || 'Ask AI (Beta) to edit or generate...'\n }\n autoFocus\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleClick()\n }}\n />\n <Toolbar.Button onClick={handleClick}>\n <ArrowRight />\n </Toolbar.Button>\n </div>\n {hasCompletion ? (\n <AICompletionCommands\n editor={editor}\n onDiscard={() => {\n editor?.chain()?.focus()?.run()\n onOpenChange(false)\n }}\n completion={object}\n />\n ) : (\n <AISelectorCommands\n messages={object}\n editor={editor}\n onSelect={(value, options) => {\n submit({ prompt: value, body: options as any })\n }}\n />\n )}\n </>\n )}\n </>\n </Surface>\n )\n}\n"],"names":["ArrowRight","Sparkles","useCallback","useRef","useState","TextareaAutosize","experimental_useObject","useObject","i18next","Markdown","TiptapSchema","getPrevText","AICompletionCommands","AISelectorCommands","Surface","Toolbar","CrazySpinner","ScrollArea","useExtractMarkdown","AIEditorPanel","editor","onOpenChange","inputValue","setInputValue","view","editorNode","dom","boundigClient","getBoundingClientRect","inputRef","object","submit","isLoading","api","schema","hasCompletion","Boolean","handleClick","prompt","body","option","command","language","storage","aiCommand","text","chars","markdown","className","style","width","div","dir","ref","value","onChange","e","target","placeholder","t","autoFocus","onKeyDown","key","Button","onClick","onDiscard","chain","focus","run","completion","messages","onSelect","options"],"mappings":"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"}
|