@ai-stack/payloadcms 3.2.15-beta → 3.2.17-beta
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 +87 -1
- package/dist/ai/analyse.d.ts +0 -1
- package/dist/ai/models/anthropic/generateRichText.d.ts +0 -1
- package/dist/ai/models/anthropic/generateRichText.js +7 -8
- package/dist/ai/models/anthropic/generateRichText.js.map +1 -1
- package/dist/ai/models/anthropic/index.d.ts +0 -1
- package/dist/ai/models/anthropic/index.js +54 -3
- package/dist/ai/models/anthropic/index.js.map +1 -1
- package/dist/ai/models/elevenLabs/generateVoice.d.ts +1 -2
- package/dist/ai/models/elevenLabs/index.d.ts +0 -1
- package/dist/ai/models/elevenLabs/index.js +5 -2
- package/dist/ai/models/elevenLabs/index.js.map +1 -1
- package/dist/ai/models/elevenLabs/voices.d.ts +6 -2
- package/dist/ai/models/elevenLabs/voices.js.map +1 -1
- package/dist/ai/models/index.d.ts +0 -1
- package/dist/ai/models/openai/generateImage.d.ts +1 -2
- package/dist/ai/models/openai/generateImage.js +6 -4
- package/dist/ai/models/openai/generateImage.js.map +1 -1
- package/dist/ai/models/openai/generateRichText.d.ts +0 -1
- package/dist/ai/models/openai/generateRichText.js +9 -12
- package/dist/ai/models/openai/generateRichText.js.map +1 -1
- package/dist/ai/models/openai/generateVoice.d.ts +1 -2
- package/dist/ai/models/openai/index.d.ts +0 -1
- package/dist/ai/models/openai/index.js +63 -4
- package/dist/ai/models/openai/index.js.map +1 -1
- package/dist/ai/models/openai/openai.d.ts +0 -1
- package/dist/ai/models/openai/openai.js +1 -2
- package/dist/ai/models/openai/openai.js.map +1 -1
- package/dist/ai/prompts.d.ts +2 -23
- package/dist/ai/prompts.js +2 -2
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.d.ts +5 -4
- package/dist/ai/schemas/lexicalJsonSchema.js +3 -1
- package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
- package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -1
- package/dist/ai/utils/filterEditorSchemaByNodes.d.ts +19 -29
- package/dist/ai/utils/filterEditorSchemaByNodes.js +4 -2
- package/dist/ai/utils/filterEditorSchemaByNodes.js.map +1 -1
- package/dist/ai/utils/generateFileNameByPrompt.d.ts +1 -2
- package/dist/ai/utils/generateFileNameByPrompt.js.map +1 -1
- package/dist/ai/utils/isObjectSchema.d.ts +0 -1
- package/dist/ai/utils/systemGenerate.d.ts +0 -1
- package/dist/collections/Instructions.d.ts +0 -1
- package/dist/collections/Instructions.js +2 -2
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +0 -1
- package/dist/endpoints/fetchFields.d.ts +2 -3
- package/dist/endpoints/fetchFields.js +8 -3
- package/dist/endpoints/fetchFields.js.map +1 -1
- package/dist/endpoints/index.d.ts +0 -1
- package/dist/endpoints/index.js +122 -31
- package/dist/endpoints/index.js.map +1 -1
- package/dist/exports/client.d.ts +1 -1
- package/dist/exports/client.js +1 -0
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/fields.d.ts +0 -1
- package/dist/exports/types.d.ts +2 -3
- package/dist/exports/types.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.d.ts +10 -2
- package/dist/fields/ComposeField/ComposeField.js +13 -5
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts +2 -2
- package/dist/fields/LexicalEditor/feature.client.d.ts +2 -3
- package/dist/fields/LexicalEditor/feature.server.d.ts +0 -1
- package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -1
- package/dist/fields/PromptEditorField/PromptEditorField.js +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/defaultStyle.d.ts +0 -1
- package/dist/fields/SelectField/SelectField.d.ts +2 -2
- package/dist/fields/SelectField/SelectField.js +15 -4
- package/dist/fields/SelectField/SelectField.js.map +1 -1
- package/dist/index.d.ts +2 -6
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +5 -2
- package/dist/init.js +8 -7
- package/dist/init.js.map +1 -1
- package/dist/libraries/handlebars/asyncHandlebars.d.ts +0 -1
- package/dist/libraries/handlebars/helpers.d.ts +1 -2
- package/dist/libraries/handlebars/helpers.js +6 -1
- package/dist/libraries/handlebars/helpers.js.map +1 -1
- package/dist/libraries/handlebars/helpersMap.d.ts +0 -1
- package/dist/libraries/handlebars/replacePlaceholders.d.ts +0 -1
- package/dist/plugin.d.ts +0 -1
- package/dist/plugin.js +7 -5
- package/dist/plugin.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.d.ts +1 -2
- package/dist/providers/FieldProvider/useFieldProps.d.ts +3 -4
- package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts +2 -11
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +10 -9
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/context.d.ts +16 -0
- package/dist/providers/InstructionsProvider/context.js +13 -0
- package/dist/providers/InstructionsProvider/context.js.map +1 -0
- package/dist/providers/InstructionsProvider/useInstructions.d.ts +0 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +29 -15
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/translations/index.d.ts +0 -1
- package/dist/types/handlebars-async-helpers.d.js +2 -0
- package/dist/types/handlebars-async-helpers.d.js.map +1 -0
- package/dist/types/handlebars-dist-handlebars.d.js +2 -0
- package/dist/types/handlebars-dist-handlebars.d.js.map +1 -0
- package/dist/types/react-mentions.d.js +2 -0
- package/dist/types/react-mentions.d.js.map +1 -0
- package/dist/types.d.ts +55 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.d.ts +0 -1
- package/dist/ui/Compose/Compose.js +61 -25
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
- package/dist/ui/Compose/hooks/menu/Item.d.ts +3 -2
- package/dist/ui/Compose/hooks/menu/Item.js +2 -2
- package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts +10 -3
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js +10 -5
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/items.d.ts +8 -9
- package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +0 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js +2 -2
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +7 -7
- package/dist/ui/Compose/hooks/menu/useMenu.js +12 -9
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts +0 -1
- package/dist/ui/Compose/hooks/useGenerate.js +41 -20
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
- package/dist/ui/Compose/hooks/useHistory.js +2 -2
- package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
- package/dist/ui/Icons/Icons.d.ts +34 -34
- package/dist/ui/Icons/Icons.js +1 -1
- package/dist/ui/Icons/Icons.js.map +1 -1
- package/dist/ui/Icons/LottieAnimation.d.ts +3 -3
- package/dist/ui/Icons/LottieAnimation.js +1 -0
- package/dist/ui/Icons/LottieAnimation.js.map +1 -1
- package/dist/utilities/editorSchemaValidator.d.ts +1 -2
- package/dist/utilities/editorSchemaValidator.js.map +1 -1
- package/dist/utilities/extractImageData.d.ts +0 -1
- package/dist/utilities/extractPromptAttachments.d.ts +2 -0
- package/dist/utilities/extractPromptAttachments.js +32 -0
- package/dist/utilities/extractPromptAttachments.js.map +1 -0
- package/dist/utilities/getFieldBySchemaPath.d.ts +0 -1
- package/dist/utilities/getFieldBySchemaPath.js +12 -4
- package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
- package/dist/utilities/getFieldInfo.d.ts +1 -2
- package/dist/utilities/getGenerationModels.d.ts +1 -2
- package/dist/utilities/isPluginActivated.d.ts +0 -1
- package/dist/utilities/isPluginActivated.js +1 -1
- package/dist/utilities/isPluginActivated.js.map +1 -1
- package/dist/utilities/lexicalToHTML.d.ts +0 -1
- package/dist/utilities/setSafeLexicalState.d.ts +1 -2
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/dist/utilities/updateFieldsConfig.d.ts +0 -1
- package/dist/utilities/updateFieldsConfig.js +10 -3
- package/dist/utilities/updateFieldsConfig.js.map +1 -1
- package/package.json +104 -65
- package/dist/ai/analyse.d.ts.map +0 -1
- package/dist/ai/models/anthropic/generateRichText.d.ts.map +0 -1
- package/dist/ai/models/anthropic/index.d.ts.map +0 -1
- package/dist/ai/models/elevenLabs/generateVoice.d.ts.map +0 -1
- package/dist/ai/models/elevenLabs/index.d.ts.map +0 -1
- package/dist/ai/models/elevenLabs/voices.d.ts.map +0 -1
- package/dist/ai/models/index.d.ts.map +0 -1
- package/dist/ai/models/openai/generateImage.d.ts.map +0 -1
- package/dist/ai/models/openai/generateRichText.d.ts.map +0 -1
- package/dist/ai/models/openai/generateVoice.d.ts.map +0 -1
- package/dist/ai/models/openai/index.d.ts.map +0 -1
- package/dist/ai/models/openai/openai.d.ts.map +0 -1
- package/dist/ai/prompts.d.ts.map +0 -1
- package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +0 -1
- package/dist/ai/utils/editImagesWithOpenAI.d.ts.map +0 -1
- package/dist/ai/utils/filterEditorSchemaByNodes.d.ts.map +0 -1
- package/dist/ai/utils/generateFileNameByPrompt.d.ts.map +0 -1
- package/dist/ai/utils/isObjectSchema.d.ts.map +0 -1
- package/dist/ai/utils/systemGenerate.d.ts.map +0 -1
- package/dist/collections/Instructions.d.ts.map +0 -1
- package/dist/defaults.d.ts.map +0 -1
- package/dist/endpoints/fetchFields.d.ts.map +0 -1
- package/dist/endpoints/index.d.ts.map +0 -1
- package/dist/exports/client.d.ts.map +0 -1
- package/dist/exports/fields.d.ts.map +0 -1
- package/dist/exports/types.d.ts.map +0 -1
- package/dist/fields/ComposeField/ComposeField.d.ts.map +0 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +0 -1
- package/dist/fields/LexicalEditor/feature.client.d.ts.map +0 -1
- package/dist/fields/LexicalEditor/feature.server.d.ts.map +0 -1
- package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +0 -1
- package/dist/fields/PromptEditorField/defaultStyle.d.ts.map +0 -1
- package/dist/fields/SelectField/SelectField.d.ts.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/init.d.ts.map +0 -1
- package/dist/libraries/handlebars/asyncHandlebars.d.ts.map +0 -1
- package/dist/libraries/handlebars/helpers.d.ts.map +0 -1
- package/dist/libraries/handlebars/helpersMap.d.ts.map +0 -1
- package/dist/libraries/handlebars/replacePlaceholders.d.ts.map +0 -1
- package/dist/plugin.d.ts.map +0 -1
- package/dist/providers/FieldProvider/FieldProvider.d.ts.map +0 -1
- package/dist/providers/FieldProvider/useFieldProps.d.ts.map +0 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +0 -1
- package/dist/providers/InstructionsProvider/useInstructions.d.ts.map +0 -1
- package/dist/translations/index.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/ui/Compose/Compose.d.ts.map +0 -1
- package/dist/ui/Compose/UndoRedoActions.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/menu/Item.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/menu/items.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts.map +0 -1
- package/dist/ui/Compose/hooks/useHistory.d.ts.map +0 -1
- package/dist/ui/Icons/Icons.d.ts.map +0 -1
- package/dist/ui/Icons/LottieAnimation.d.ts.map +0 -1
- package/dist/utilities/editorSchemaValidator.d.ts.map +0 -1
- package/dist/utilities/extractImageData.d.ts.map +0 -1
- package/dist/utilities/getFieldBySchemaPath.d.ts.map +0 -1
- package/dist/utilities/getFieldInfo.d.ts.map +0 -1
- package/dist/utilities/getGenerationModels.d.ts.map +0 -1
- package/dist/utilities/isPluginActivated.d.ts.map +0 -1
- package/dist/utilities/lexicalToHTML.d.ts.map +0 -1
- package/dist/utilities/setSafeLexicalState.d.ts.map +0 -1
- package/dist/utilities/updateFieldsConfig.d.ts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/Item.tsx"],"sourcesContent":["import React, { memo } from 'react'\n\nimport type { BaseItemProps } from '../../../../types.js'\n\nimport { ArrowIcon } from '../../../Icons/Icons.js'\nimport styles from './menu.module.scss'\n\nexport const Item: React.FC<BaseItemProps> = memo(\n ({ children, disabled, isActive, onClick, ...rest }) => (\n <span\n className={styles.generate_button + ' ' + (isActive ? styles.active : '')}\n data-disabled={disabled}\n onClick={!disabled ? onClick :
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/Item.tsx"],"sourcesContent":["import React, { memo } from 'react'\n\nimport type { BaseItemProps } from '../../../../types.js'\n\nimport { ArrowIcon } from '../../../Icons/Icons.js'\nimport styles from './menu.module.scss'\n\nexport const Item: React.FC<BaseItemProps> = memo(\n ({ children, disabled, isActive, onClick, ...rest }) => (\n <span\n className={styles.generate_button + ' ' + (isActive ? styles.active : '')}\n data-disabled={disabled}\n onClick={\n !disabled && typeof onClick === 'function'\n ? (onClick as React.MouseEventHandler<HTMLSpanElement>)\n : undefined\n }\n onKeyDown={\n !disabled && typeof onClick === 'function'\n ? (onClick as React.KeyboardEventHandler<HTMLSpanElement>)\n : undefined\n }\n role=\"presentation\"\n {...rest}\n >\n {children}\n </span>\n ),\n)\n\nexport const createMenuItem = (\n IconComponent: React.ComponentType<{ size?: number }>,\n initialText: string,\n) =>\n memo(({ children, disabled, hideIcon, isMenu, onClick, ...rest }: BaseItemProps) => (\n <Item disabled={disabled} onClick={onClick} {...rest}>\n {hideIcon || <IconComponent size={18} />}\n {children || <span className={styles.text}>{initialText}</span>}\n {isMenu && <ArrowIcon size={18} />}\n </Item>\n ))\n"],"names":["React","memo","ArrowIcon","styles","Item","children","disabled","isActive","onClick","rest","span","className","generate_button","active","data-disabled","undefined","onKeyDown","role","createMenuItem","IconComponent","initialText","hideIcon","isMenu","size","text"],"mappings":";AAAA,OAAOA,SAASC,IAAI,QAAQ,QAAO;AAInC,SAASC,SAAS,QAAQ,0BAAyB;AACnD,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,qBAAgCH,KAC3C,CAAC,EAAEI,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAGC,MAAM,iBACjD,KAACC;QACCC,WAAWR,OAAOS,eAAe,GAAG,MAAOL,CAAAA,WAAWJ,OAAOU,MAAM,GAAG,EAAC;QACvEC,iBAAeR;QACfE,SACE,CAACF,YAAY,OAAOE,YAAY,aAC3BA,UACDO;QAENC,WACE,CAACV,YAAY,OAAOE,YAAY,aAC3BA,UACDO;QAENE,MAAK;QACJ,GAAGR,IAAI;kBAEPJ;QAGN;AAED,OAAO,MAAMa,iBAAiB,CAC5BC,eACAC,4BAEAnB,KAAK,CAAC,EAAEI,QAAQ,EAAEC,QAAQ,EAAEe,QAAQ,EAAEC,MAAM,EAAEd,OAAO,EAAE,GAAGC,MAAqB,iBAC7E,MAACL;YAAKE,UAAUA;YAAUE,SAASA;YAAU,GAAGC,IAAI;;gBACjDY,0BAAY,KAACF;oBAAcI,MAAM;;gBACjClB,0BAAY,KAACK;oBAAKC,WAAWR,OAAOqB,IAAI;8BAAGJ;;gBAC3CE,wBAAU,KAACpB;oBAAUqB,MAAM;;;YAE9B"}
|
|
@@ -1,4 +1,11 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
export declare const TranslateMenu: ({ onClick }: {
|
|
2
|
-
onClick:
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
onClick: (data: {
|
|
4
|
+
locale: string;
|
|
5
|
+
}) => void;
|
|
6
|
+
}) => React.JSX.Element;
|
|
7
|
+
export declare const MemoizedTranslateMenu: React.MemoExoticComponent<({ onClick }: {
|
|
8
|
+
onClick: (data: {
|
|
9
|
+
locale: string;
|
|
10
|
+
}) => void;
|
|
11
|
+
}) => React.JSX.Element>;
|
|
@@ -1,14 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import locales from 'locale-codes';
|
|
3
|
-
import React, { useState } from 'react';
|
|
3
|
+
import React, { memo, useState } from 'react';
|
|
4
|
+
import { useInstructions } from '../../../../providers/InstructionsProvider/useInstructions.js';
|
|
4
5
|
import { Item } from './Item.js';
|
|
5
6
|
import { Translate } from './items.js';
|
|
6
7
|
import styles from './menu.module.scss';
|
|
7
8
|
export const TranslateMenu = ({ onClick })=>{
|
|
8
9
|
const [show, setShow] = useState(false);
|
|
9
|
-
const
|
|
10
|
+
const { enabledLanguages = [] } = useInstructions();
|
|
11
|
+
let filteredLocales = locales.all.filter((a)=>{
|
|
10
12
|
return a.tag && a.location;
|
|
11
13
|
});
|
|
14
|
+
if (enabledLanguages?.length) {
|
|
15
|
+
filteredLocales = filteredLocales.filter((a)=>enabledLanguages?.includes(a.tag));
|
|
16
|
+
}
|
|
12
17
|
const [languages, setLanguages] = useState(filteredLocales);
|
|
13
18
|
const [inputFocus, setInputFocus] = useState(false);
|
|
14
19
|
return /*#__PURE__*/ _jsxs("div", {
|
|
@@ -33,8 +38,7 @@ export const TranslateMenu = ({ onClick })=>{
|
|
|
33
38
|
children: /*#__PURE__*/ _jsxs("div", {
|
|
34
39
|
className: `${styles.menu} ${styles.subMenu}`,
|
|
35
40
|
style: {
|
|
36
|
-
background:
|
|
37
|
-
minHeight: "300px"
|
|
41
|
+
background: 'var(--popup-bg)'
|
|
38
42
|
},
|
|
39
43
|
children: [
|
|
40
44
|
/*#__PURE__*/ _jsx(Item, {
|
|
@@ -52,7 +56,7 @@ export const TranslateMenu = ({ onClick })=>{
|
|
|
52
56
|
const value = event.target.value;
|
|
53
57
|
setLanguages(filteredLocales.filter((l)=>{
|
|
54
58
|
const lowerCaseValue = value.toLowerCase();
|
|
55
|
-
return l.name.toLowerCase().startsWith(lowerCaseValue) || l.location.toLowerCase().startsWith(lowerCaseValue) || l.tag.toLowerCase().startsWith(lowerCaseValue);
|
|
59
|
+
return l.name.toLowerCase().startsWith(lowerCaseValue) || l.location && l.location.toLowerCase().startsWith(lowerCaseValue) || l.tag.toLowerCase().startsWith(lowerCaseValue);
|
|
56
60
|
}));
|
|
57
61
|
},
|
|
58
62
|
onFocus: ()=>setInputFocus(true),
|
|
@@ -78,5 +82,6 @@ export const TranslateMenu = ({ onClick })=>{
|
|
|
78
82
|
]
|
|
79
83
|
});
|
|
80
84
|
};
|
|
85
|
+
export const MemoizedTranslateMenu = /*#__PURE__*/ memo(TranslateMenu);
|
|
81
86
|
|
|
82
87
|
//# sourceMappingURL=TranslateMenu.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"sourcesContent":["import locales from 'locale-codes'\nimport React, { useState } from 'react'\n\nimport { Item } from './Item.js'\nimport { Translate } from './items.js'\nimport styles from './menu.module.scss'\n\nexport const TranslateMenu = ({ onClick }) => {\n const [show, setShow] = useState(false)\n\n const filteredLocales = locales.all.filter((a) => {\n return a.tag && a.location\n })\n\n const [languages, setLanguages] = useState(filteredLocales)\n const [inputFocus, setInputFocus] = useState(false)\n\n return (\n <div\n className={styles.menu}\n onMouseLeave={() => {\n if (!inputFocus) {\n setShow(false)\n }\n }}\n >\n <Translate\n isActive={show}\n isMenu\n onClick={() => {\n setShow(!show)\n }}\n onMouseEnter={() => setShow(true)}\n
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"sourcesContent":["import locales from 'locale-codes'\nimport React, { memo, useState } from 'react'\n\nimport { useInstructions } from '../../../../providers/InstructionsProvider/useInstructions.js'\nimport { Item } from './Item.js'\nimport { Translate } from './items.js'\nimport styles from './menu.module.scss'\n\nexport const TranslateMenu = ({ onClick }: { onClick: (data: { locale: string }) => void }) => {\n const [show, setShow] = useState(false)\n\n const { enabledLanguages = [] } = useInstructions()\n\n let filteredLocales = locales.all.filter((a) => {\n return a.tag && a.location\n })\n\n if (enabledLanguages?.length) {\n filteredLocales = filteredLocales.filter((a) => enabledLanguages?.includes(a.tag))\n }\n\n const [languages, setLanguages] = useState(filteredLocales)\n const [inputFocus, setInputFocus] = useState(false)\n\n return (\n <div\n className={styles.menu}\n onMouseLeave={() => {\n if (!inputFocus) {\n setShow(false)\n }\n }}\n >\n <Translate\n isActive={show}\n isMenu\n onClick={() => {\n setShow(!show)\n }}\n onMouseEnter={() => setShow(true)}\n />\n <div className={styles.hoverMenu} data-show={show}>\n <div\n className={`${styles.menu} ${styles.subMenu}`}\n style={{\n background: 'var(--popup-bg)',\n // minHeight: '300px',\n }}\n >\n <Item\n onClick={() => {}}\n style={{\n background: 'transparent',\n padding: '0 0 5px 0',\n position: 'sticky',\n top: 0,\n }}\n >\n <input\n className={styles.menuInput}\n onBlur={() => setInputFocus(false)}\n onChange={(event) => {\n const value = event.target.value\n setLanguages(\n filteredLocales.filter((l) => {\n const lowerCaseValue = value.toLowerCase()\n return (\n l.name.toLowerCase().startsWith(lowerCaseValue) ||\n (l.location && l.location.toLowerCase().startsWith(lowerCaseValue)) ||\n l.tag.toLowerCase().startsWith(lowerCaseValue)\n )\n }),\n )\n }}\n onFocus={() => setInputFocus(true)}\n placeholder=\"Search...\"\n />\n </Item>\n {languages.map((locale) => {\n return (\n <Item\n key={locale.tag}\n onClick={() => {\n onClick({ locale: locale.tag })\n }}\n >\n <span className={styles.ellipsis}>{`${locale.location} (${locale.tag})`}</span>\n </Item>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\nexport const MemoizedTranslateMenu = memo(TranslateMenu)\n"],"names":["locales","React","memo","useState","useInstructions","Item","Translate","styles","TranslateMenu","onClick","show","setShow","enabledLanguages","filteredLocales","all","filter","a","tag","location","length","includes","languages","setLanguages","inputFocus","setInputFocus","div","className","menu","onMouseLeave","isActive","isMenu","onMouseEnter","hoverMenu","data-show","subMenu","style","background","padding","position","top","input","menuInput","onBlur","onChange","event","value","target","l","lowerCaseValue","toLowerCase","name","startsWith","onFocus","placeholder","map","locale","span","ellipsis","MemoizedTranslateMenu"],"mappings":";AAAA,OAAOA,aAAa,eAAc;AAClC,OAAOC,SAASC,IAAI,EAAEC,QAAQ,QAAQ,QAAO;AAE7C,SAASC,eAAe,QAAQ,gEAA+D;AAC/F,SAASC,IAAI,QAAQ,YAAW;AAChC,SAASC,SAAS,QAAQ,aAAY;AACtC,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,gBAAgB,CAAC,EAAEC,OAAO,EAAmD;IACxF,MAAM,CAACC,MAAMC,QAAQ,GAAGR,SAAS;IAEjC,MAAM,EAAES,mBAAmB,EAAE,EAAE,GAAGR;IAElC,IAAIS,kBAAkBb,QAAQc,GAAG,CAACC,MAAM,CAAC,CAACC;QACxC,OAAOA,EAAEC,GAAG,IAAID,EAAEE,QAAQ;IAC5B;IAEA,IAAIN,kBAAkBO,QAAQ;QAC5BN,kBAAkBA,gBAAgBE,MAAM,CAAC,CAACC,IAAMJ,kBAAkBQ,SAASJ,EAAEC,GAAG;IAClF;IAEA,MAAM,CAACI,WAAWC,aAAa,GAAGnB,SAASU;IAC3C,MAAM,CAACU,YAAYC,cAAc,GAAGrB,SAAS;IAE7C,qBACE,MAACsB;QACCC,WAAWnB,OAAOoB,IAAI;QACtBC,cAAc;YACZ,IAAI,CAACL,YAAY;gBACfZ,QAAQ;YACV;QACF;;0BAEA,KAACL;gBACCuB,UAAUnB;gBACVoB,MAAM;gBACNrB,SAAS;oBACPE,QAAQ,CAACD;gBACX;gBACAqB,cAAc,IAAMpB,QAAQ;;0BAE9B,KAACc;gBAAIC,WAAWnB,OAAOyB,SAAS;gBAAEC,aAAWvB;0BAC3C,cAAA,MAACe;oBACCC,WAAW,GAAGnB,OAAOoB,IAAI,CAAC,CAAC,EAAEpB,OAAO2B,OAAO,EAAE;oBAC7CC,OAAO;wBACLC,YAAY;oBAEd;;sCAEA,KAAC/B;4BACCI,SAAS,KAAO;4BAChB0B,OAAO;gCACLC,YAAY;gCACZC,SAAS;gCACTC,UAAU;gCACVC,KAAK;4BACP;sCAEA,cAAA,KAACC;gCACCd,WAAWnB,OAAOkC,SAAS;gCAC3BC,QAAQ,IAAMlB,cAAc;gCAC5BmB,UAAU,CAACC;oCACT,MAAMC,QAAQD,MAAME,MAAM,CAACD,KAAK;oCAChCvB,aACET,gBAAgBE,MAAM,CAAC,CAACgC;wCACtB,MAAMC,iBAAiBH,MAAMI,WAAW;wCACxC,OACEF,EAAEG,IAAI,CAACD,WAAW,GAAGE,UAAU,CAACH,mBAC/BD,EAAE7B,QAAQ,IAAI6B,EAAE7B,QAAQ,CAAC+B,WAAW,GAAGE,UAAU,CAACH,mBACnDD,EAAE9B,GAAG,CAACgC,WAAW,GAAGE,UAAU,CAACH;oCAEnC;gCAEJ;gCACAI,SAAS,IAAM5B,cAAc;gCAC7B6B,aAAY;;;wBAGfhC,UAAUiC,GAAG,CAAC,CAACC;4BACd,qBACE,KAAClD;gCAECI,SAAS;oCACPA,QAAQ;wCAAE8C,QAAQA,OAAOtC,GAAG;oCAAC;gCAC/B;0CAEA,cAAA,KAACuC;oCAAK9B,WAAWnB,OAAOkD,QAAQ;8CAAG,GAAGF,OAAOrC,QAAQ,CAAC,EAAE,EAAEqC,OAAOtC,GAAG,CAAC,CAAC,CAAC;;+BALlEsC,OAAOtC,GAAG;wBAQrB;;;;;;AAKV,EAAC;AAED,OAAO,MAAMyC,sCAAwBxD,KAAKM,eAAc"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
export declare const Proofread: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
2
|
-
export declare const Rephrase: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
3
|
-
export declare const Translate: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
4
|
-
export declare const Expand: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
5
|
-
export declare const Summarize: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
6
|
-
export declare const Simplify: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
7
|
-
export declare const Compose: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
8
|
-
export declare const Settings: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react
|
|
9
|
-
//# sourceMappingURL=items.d.ts.map
|
|
1
|
+
export declare const Proofread: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
2
|
+
export declare const Rephrase: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
3
|
+
export declare const Translate: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
4
|
+
export declare const Expand: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
5
|
+
export declare const Summarize: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
6
|
+
export declare const Simplify: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
7
|
+
export declare const Compose: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
8
|
+
export declare const Settings: import("react").MemoExoticComponent<({ children, disabled, hideIcon, isMenu, onClick, ...rest }: import("../../../../types.js").BaseItemProps) => import("react").JSX.Element>;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MemoizedTranslateMenu } from './TranslateMenu.js';
|
|
2
2
|
import { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js';
|
|
3
3
|
export const menuItemsMap = [
|
|
4
4
|
{
|
|
@@ -19,7 +19,7 @@ export const menuItemsMap = [
|
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
name: 'Translate',
|
|
22
|
-
component:
|
|
22
|
+
component: MemoizedTranslateMenu,
|
|
23
23
|
excludedFor: [
|
|
24
24
|
'upload'
|
|
25
25
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { TranslateMenu } from './TranslateMenu.js'\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component:
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["MemoizedTranslateMenu","Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,qBAAqB,QAAuB,qBAAoB;AACzE,SAASC,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAShG,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWP;QAAWQ,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAe;IAChG;QAAEH,MAAM;QAAYC,WAAWN;QAAUO,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAa;IAC5F;QACEH,MAAM;QACNC,WAAWV;QACXW,aAAa;YAAC;SAAS;QACvBC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWR;QAAQS,aAAa;YAAC;YAAU;SAAO;QAAEC,aAAa;IAAY;IAC/F;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;YAAU;YAAQ;SAAW;QAC3CC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWJ;QAAUK,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAc;IAC7F;QAAEH,MAAM;QAAWC,WAAWT;QAASW,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWL;IAAS;CACzC,CAAA"}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
|
+
import React from 'react';
|
|
1
2
|
import type { UseMenuEvents, UseMenuOptions } from '../../../../types.js';
|
|
2
3
|
export declare const useMenu: (menuEvents: UseMenuEvents, options: UseMenuOptions) => {
|
|
3
4
|
ActiveComponent: ({ isLoading, stop }: {
|
|
4
|
-
isLoading:
|
|
5
|
-
stop:
|
|
6
|
-
}) =>
|
|
5
|
+
isLoading: boolean;
|
|
6
|
+
stop: () => void;
|
|
7
|
+
}) => React.JSX.Element;
|
|
7
8
|
Menu: ({ isLoading, onClose }: {
|
|
8
|
-
isLoading:
|
|
9
|
-
onClose:
|
|
10
|
-
}) =>
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
onClose: () => void;
|
|
11
|
+
}) => React.JSX.Element;
|
|
11
12
|
};
|
|
12
|
-
//# sourceMappingURL=useMenu.d.ts.map
|
|
@@ -8,12 +8,12 @@ import { menuItemsMap } from './itemsMap.js';
|
|
|
8
8
|
import styles from './menu.module.scss';
|
|
9
9
|
const getActiveComponent = (ac)=>{
|
|
10
10
|
switch(ac){
|
|
11
|
+
case 'Compose':
|
|
12
|
+
return Compose;
|
|
11
13
|
case 'Proofread':
|
|
12
14
|
return Proofread;
|
|
13
15
|
case 'Rephrase':
|
|
14
16
|
return Rephrase;
|
|
15
|
-
case 'Compose':
|
|
16
|
-
return Compose;
|
|
17
17
|
default:
|
|
18
18
|
return Rephrase;
|
|
19
19
|
}
|
|
@@ -21,7 +21,7 @@ const getActiveComponent = (ac)=>{
|
|
|
21
21
|
export const useMenu = (menuEvents, options)=>{
|
|
22
22
|
const { type: fieldType, path: pathFromContext } = useFieldProps();
|
|
23
23
|
const field = useField({
|
|
24
|
-
path: pathFromContext
|
|
24
|
+
path: pathFromContext ?? ''
|
|
25
25
|
});
|
|
26
26
|
const [activeComponent, setActiveComponent] = useState('Rephrase');
|
|
27
27
|
const { initialValue, value } = field;
|
|
@@ -30,7 +30,7 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
30
30
|
setActiveComponent('Compose');
|
|
31
31
|
return;
|
|
32
32
|
}
|
|
33
|
-
if (menuItemsMap.some((i)=>i.excludedFor?.includes(fieldType))) {
|
|
33
|
+
if (menuItemsMap.some((i)=>i.excludedFor?.includes(fieldType ?? ''))) {
|
|
34
34
|
setActiveComponent('Compose');
|
|
35
35
|
return;
|
|
36
36
|
}
|
|
@@ -67,12 +67,14 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
67
67
|
});
|
|
68
68
|
};
|
|
69
69
|
}, [
|
|
70
|
-
activeComponent
|
|
70
|
+
activeComponent,
|
|
71
|
+
menuEvents
|
|
71
72
|
]);
|
|
72
73
|
const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>{
|
|
73
|
-
if (i.name === 'Settings' && !options.isConfigAllowed)
|
|
74
|
-
|
|
75
|
-
|
|
74
|
+
if (i.name === 'Settings' && !options.isConfigAllowed) {
|
|
75
|
+
return false;
|
|
76
|
+
} // Disable settings if a user role is not permitted
|
|
77
|
+
return i.name !== activeComponent && !i.excludedFor?.includes(fieldType ?? '');
|
|
76
78
|
}), [
|
|
77
79
|
activeComponent,
|
|
78
80
|
fieldType,
|
|
@@ -97,7 +99,8 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
97
99
|
})
|
|
98
100
|
});
|
|
99
101
|
}, [
|
|
100
|
-
filteredMenuItems
|
|
102
|
+
filteredMenuItems,
|
|
103
|
+
menuEvents
|
|
101
104
|
]);
|
|
102
105
|
return {
|
|
103
106
|
ActiveComponent: MemoizedActiveComponent,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents, UseMenuOptions } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac) => {\n switch (ac) {\n case '
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useField } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents, UseMenuOptions } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac: ActionMenuItems) => {\n switch (ac) {\n case 'Compose':\n return Compose\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents, options: UseMenuOptions) => {\n const { type: fieldType, path: pathFromContext } = useFieldProps()\n const field = useField({ path: pathFromContext ?? '' })\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n const { initialValue, value } = field\n\n useEffect(() => {\n if (!value) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType ?? ''))) {\n setActiveComponent('Compose')\n return\n }\n\n if (typeof value === 'string' && value !== initialValue) {\n setActiveComponent('Proofread')\n } else {\n setActiveComponent('Rephrase')\n }\n }, [initialValue, value, fieldType])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading, stop }: { isLoading: boolean; stop: () => void }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)!\n return (\n <ActiveComponent\n hideIcon\n onClick={(data: unknown) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n trigger(data)\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={isLoading ? 'Click to stop' : activeItem.name}\n >\n {isLoading && activeItem.loadingText}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => {\n if (i.name === 'Settings' && !options.isConfigAllowed) {\n return false\n } // Disable settings if a user role is not permitted\n return i.name !== activeComponent && !i.excludedFor?.includes(fieldType ?? '')\n }),\n [activeComponent, fieldType, options.isConfigAllowed],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }: { isLoading: boolean; onClose: () => void }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data: unknown) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`]?.(data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useField","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","options","type","fieldType","path","pathFromContext","field","activeComponent","setActiveComponent","initialValue","value","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","stop","ActiveComponent","activeItem","find","name","hideIcon","onClick","data","trigger","console","error","title","loadingText","filteredMenuItems","filter","isConfigAllowed","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { useCompletion, experimental_useObject as useObject } from '@ai-sdk/react';
|
|
2
2
|
import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
|
|
3
|
-
import { useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui';
|
|
3
|
+
import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui';
|
|
4
4
|
import { jsonSchema } from 'ai';
|
|
5
5
|
import { useCallback, useEffect, useMemo, useRef } from 'react';
|
|
6
6
|
import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE, PLUGIN_NAME } from '../../../defaults.js';
|
|
@@ -23,7 +23,7 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
23
23
|
const { config } = useConfig();
|
|
24
24
|
const { routes: { api }, serverURL } = config;
|
|
25
25
|
const { setValue } = useField({
|
|
26
|
-
path: pathFromContext
|
|
26
|
+
path: pathFromContext ?? ''
|
|
27
27
|
});
|
|
28
28
|
const { set: setHistory } = useHistory();
|
|
29
29
|
const { getData } = useForm();
|
|
@@ -31,7 +31,7 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
31
31
|
const localFromContext = useLocale();
|
|
32
32
|
const { config: { collections } } = useConfig();
|
|
33
33
|
const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
|
|
34
|
-
const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection
|
|
34
|
+
const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection?.admin ?? {};
|
|
35
35
|
const { schema: editorSchema = {} } = editorConfig;
|
|
36
36
|
const memoizedValidator = useMemo(()=>{
|
|
37
37
|
return editorSchemaValidator(editorSchema);
|
|
@@ -59,6 +59,7 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
59
59
|
const { isLoading: loadingObject, object, stop: objectStop, submit } = useObject({
|
|
60
60
|
api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
|
|
61
61
|
onError: (error)=>{
|
|
62
|
+
toast.error(`Failed to generate: ${error.message}`);
|
|
62
63
|
console.error('Error generating object:', error);
|
|
63
64
|
},
|
|
64
65
|
onFinish: (result)=>{
|
|
@@ -72,12 +73,15 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
72
73
|
schema: memoizedSchema
|
|
73
74
|
});
|
|
74
75
|
useEffect(()=>{
|
|
75
|
-
if (!object)
|
|
76
|
+
if (!object) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
76
79
|
requestAnimationFrame(()=>{
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
80
|
+
// TODO: Temporary disabled pre validation, sometimes it fails to validate
|
|
81
|
+
// const validateObject = await memoizedSchema?.validate?.(object)
|
|
82
|
+
// if (validateObject?.success) {
|
|
83
|
+
setSafeLexicalState(object, editor);
|
|
84
|
+
// }
|
|
81
85
|
});
|
|
82
86
|
}, [
|
|
83
87
|
object,
|
|
@@ -86,6 +90,7 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
86
90
|
const { complete, completion, isLoading: loadingCompletion, stop: completionStop } = useCompletion({
|
|
87
91
|
api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,
|
|
88
92
|
onError: (error)=>{
|
|
93
|
+
toast.error(`Failed to generate: ${error.message}`);
|
|
89
94
|
console.error('Error generating text:', error);
|
|
90
95
|
},
|
|
91
96
|
onFinish: (prompt, result)=>{
|
|
@@ -94,7 +99,9 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
94
99
|
streamProtocol: 'data'
|
|
95
100
|
});
|
|
96
101
|
useEffect(()=>{
|
|
97
|
-
if (!completion)
|
|
102
|
+
if (!completion) {
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
98
105
|
requestAnimationFrame(()=>{
|
|
99
106
|
setValue(completion);
|
|
100
107
|
});
|
|
@@ -111,13 +118,17 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
111
118
|
};
|
|
112
119
|
submit({
|
|
113
120
|
allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),
|
|
114
|
-
doc
|
|
121
|
+
doc: {
|
|
122
|
+
...doc,
|
|
123
|
+
id: documentId
|
|
124
|
+
},
|
|
115
125
|
locale: localFromContext?.code,
|
|
116
126
|
options
|
|
117
127
|
});
|
|
118
128
|
}, [
|
|
119
129
|
localFromContext?.code,
|
|
120
|
-
instructionIdRef
|
|
130
|
+
instructionIdRef,
|
|
131
|
+
documentId
|
|
121
132
|
]);
|
|
122
133
|
const streamText = useCallback(async ({ action = 'Compose', params })=>{
|
|
123
134
|
const doc = getData();
|
|
@@ -129,7 +140,10 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
129
140
|
};
|
|
130
141
|
await complete('', {
|
|
131
142
|
body: {
|
|
132
|
-
doc
|
|
143
|
+
doc: {
|
|
144
|
+
...doc,
|
|
145
|
+
id: documentId
|
|
146
|
+
},
|
|
133
147
|
locale: localFromContext?.code,
|
|
134
148
|
options
|
|
135
149
|
}
|
|
@@ -138,14 +152,15 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
138
152
|
getData,
|
|
139
153
|
localFromContext?.code,
|
|
140
154
|
instructionIdRef,
|
|
141
|
-
complete
|
|
155
|
+
complete,
|
|
156
|
+
documentId
|
|
142
157
|
]);
|
|
143
158
|
const generateUpload = useCallback(async ()=>{
|
|
144
159
|
const doc = getData();
|
|
145
160
|
const currentInstructionId = instructionIdRef.current;
|
|
146
161
|
return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {
|
|
147
162
|
body: JSON.stringify({
|
|
148
|
-
collectionSlug,
|
|
163
|
+
collectionSlug: collectionSlug ?? '',
|
|
149
164
|
doc,
|
|
150
165
|
documentId,
|
|
151
166
|
locale: localFromContext?.code,
|
|
@@ -161,7 +176,9 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
161
176
|
}).then(async (uploadResponse)=>{
|
|
162
177
|
if (uploadResponse.ok) {
|
|
163
178
|
const { result } = await uploadResponse.json();
|
|
164
|
-
if (!result)
|
|
179
|
+
if (!result) {
|
|
180
|
+
throw new Error('generateUpload: Something went wrong');
|
|
181
|
+
}
|
|
165
182
|
setValue(result?.id);
|
|
166
183
|
setHistory(result?.id);
|
|
167
184
|
console.log('Image updated...', result);
|
|
@@ -172,8 +189,8 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
172
189
|
}
|
|
173
190
|
return uploadResponse;
|
|
174
191
|
}).catch((error)=>{
|
|
175
|
-
|
|
176
|
-
console.error(error);
|
|
192
|
+
toast.error(`Failed to generate: ${error.message}`);
|
|
193
|
+
console.error('Error generating or setting your upload, please set it manually if its saved in your media files.', error);
|
|
177
194
|
});
|
|
178
195
|
}, [
|
|
179
196
|
getData,
|
|
@@ -185,13 +202,17 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
185
202
|
]);
|
|
186
203
|
const generate = useCallback(async (options)=>{
|
|
187
204
|
if (type === 'richText') {
|
|
188
|
-
return streamObject(options
|
|
205
|
+
return streamObject(options ?? {
|
|
206
|
+
action: 'Compose'
|
|
207
|
+
});
|
|
189
208
|
}
|
|
190
209
|
if ([
|
|
191
210
|
'text',
|
|
192
211
|
'textarea'
|
|
193
|
-
].includes(type)) {
|
|
194
|
-
return streamText(options
|
|
212
|
+
].includes(type ?? '') && type) {
|
|
213
|
+
return streamText(options ?? {
|
|
214
|
+
action: 'Compose'
|
|
215
|
+
});
|
|
195
216
|
}
|
|
196
217
|
if (type === 'upload') {
|
|
197
218
|
return generateUpload();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { useCompletion, experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\n\nimport type { ActionMenuItems, GenerateTextarea } from '../../../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useHistory } from './useHistory.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\n const { type, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n\n const { editor } = editorConfigContext\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const { set: setHistory } = useHistory()\n\n const { getData } = useForm()\n const { id: documentId, collectionSlug } = useDocumentInfo()\n\n const localFromContext = useLocale()\n const {\n config: { collections },\n } = useConfig()\n\n const collection = collections.find((collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE)\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection.admin\n const { schema: editorSchema = {} } = editorConfig\n\n const memoizedValidator = useMemo(() => {\n return editorSchemaValidator(editorSchema)\n }, [editorSchema])\n\n const memoizedSchema = useMemo(\n () =>\n jsonSchema(editorSchema, {\n validate: (value) => {\n const isValid = memoizedValidator(value)\n\n if (isValid) {\n return {\n success: true,\n value,\n }\n } else {\n return {\n error: new Error('Invalid schema'),\n success: false,\n }\n }\n },\n }),\n [memoizedValidator],\n )\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object) {\n setHistory(result.object)\n setValue(result.object)\n } else {\n console.log('onFinish: result ', result)\n }\n },\n schema: memoizedSchema,\n })\n\n useEffect(() => {\n if (!object) return\n\n requestAnimationFrame(() => {\n const validateObject = memoizedSchema.validate(object)\n if (validateObject?.success) {\n setSafeLexicalState(object, editor)\n }\n })\n }, [object, editor])\n\n const {\n complete,\n completion,\n isLoading: loadingCompletion,\n stop: completionStop,\n } = useCompletion({\n api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating text:', error)\n },\n onFinish: (prompt, result) => {\n setHistory(result)\n },\n streamProtocol: 'data',\n })\n\n useEffect(() => {\n if (!completion) return\n\n requestAnimationFrame(() => {\n setValue(completion)\n })\n }, [completion])\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [localFromContext?.code, instructionIdRef],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionIdRef, complete],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n collectionSlug,\n doc,\n documentId,\n locale: localFromContext?.code,\n options: {\n instructionId: currentInstructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const { result } = await uploadResponse.json()\n if (!result) throw new Error('generateUpload: Something went wrong')\n\n setValue(result?.id)\n setHistory(result?.id)\n console.log('Image updated...', result)\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error) => error.message).join(', ')\n throw new Error(errStr)\n }\n return uploadResponse\n })\n .catch((error) => {\n console.warn(\n 'Error generating or setting your upload, please set it manually if its saved in your media files.',\n )\n console.error(error)\n })\n }, [getData, localFromContext?.code, instructionIdRef, setValue, documentId, collectionSlug])\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if (type === 'richText') {\n return streamObject(options)\n }\n\n if (['text', 'textarea'].includes(type)) {\n return streamText(options)\n }\n\n if (type === 'upload') {\n return generateUpload()\n }\n },\n [generateUpload, streamObject, streamText, type],\n )\n\n const stop = useCallback(() => {\n console.log('Stopping...')\n objectStop()\n completionStop()\n }, [objectStop, completionStop])\n\n return {\n generate,\n isLoading: loadingCompletion || loadingObject,\n stop,\n }\n}\n"],"names":["useCompletion","experimental_useObject","useObject","useEditorConfigContext","useConfig","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useMemo","useRef","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","editorSchemaValidator","setSafeLexicalState","useHistory","useGenerate","instructionId","instructionIdRef","current","type","path","pathFromContext","editorConfigContext","editor","config","routes","api","serverURL","setValue","set","setHistory","getData","id","documentId","collectionSlug","localFromContext","collections","collection","find","slug","custom","editorConfig","admin","schema","editorSchema","memoizedValidator","memoizedSchema","validate","value","isValid","success","error","Error","isLoading","loadingObject","object","stop","objectStop","submit","onError","console","onFinish","result","log","requestAnimationFrame","validateObject","complete","completion","loadingCompletion","completionStop","prompt","streamProtocol","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","locale","code","streamText","body","generateUpload","fetch","JSON","stringify","credentials","headers","method","then","uploadResponse","ok","json","errors","errStr","map","message","join","catch","warn","generate","includes"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { useCompletion, experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useMemo, useRef } from 'react'\n\nimport type { ActionMenuItems, GenerateTextarea } from '../../../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n PLUGIN_NAME,\n} from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useHistory } from './useHistory.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\n const { type, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n\n const { editor } = editorConfigContext\n\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n\n const { setValue } = useField<string>({\n path: pathFromContext ?? '',\n })\n\n const { set: setHistory } = useHistory()\n\n const { getData } = useForm()\n const { id: documentId, collectionSlug } = useDocumentInfo()\n\n const localFromContext = useLocale()\n const {\n config: { collections },\n } = useConfig()\n\n const collection = collections.find((collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE)\n const { custom: { [PLUGIN_NAME]: { editorConfig = {} } = {} } = {} } = collection?.admin ?? {}\n const { schema: editorSchema = {} } = editorConfig\n\n const memoizedValidator = useMemo(() => {\n return editorSchemaValidator(editorSchema)\n }, [editorSchema])\n\n const memoizedSchema = useMemo(\n () =>\n jsonSchema(editorSchema, {\n validate: (value) => {\n const isValid = memoizedValidator(value)\n\n if (isValid) {\n return {\n success: true,\n value,\n }\n } else {\n return {\n error: new Error('Invalid schema'),\n success: false,\n }\n }\n },\n }),\n [memoizedValidator],\n )\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error: any) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object) {\n setHistory(result.object)\n setValue(result.object)\n } else {\n console.log('onFinish: result ', result)\n }\n },\n schema: memoizedSchema,\n })\n\n useEffect(() => {\n if (!object) {\n return\n }\n\n requestAnimationFrame(() => {\n // TODO: Temporary disabled pre validation, sometimes it fails to validate\n // const validateObject = await memoizedSchema?.validate?.(object)\n // if (validateObject?.success) {\n setSafeLexicalState(object, editor)\n // }\n })\n }, [object, editor])\n\n const {\n complete,\n completion,\n isLoading: loadingCompletion,\n stop: completionStop,\n } = useCompletion({\n api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error: any) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error('Error generating text:', error)\n },\n onFinish: (prompt, result) => {\n setHistory(result)\n },\n streamProtocol: 'data',\n })\n\n useEffect(() => {\n if (!completion) {\n return\n }\n\n requestAnimationFrame(() => {\n setValue(completion)\n })\n }, [completion])\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc: {\n ...doc,\n id: documentId,\n },\n locale: localFromContext?.code,\n options,\n })\n },\n [localFromContext?.code, instructionIdRef, documentId],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n await complete('', {\n body: {\n doc: {\n ...doc,\n id: documentId,\n },\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionIdRef, complete, documentId],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n collectionSlug: collectionSlug ?? '',\n doc,\n documentId,\n locale: localFromContext?.code,\n options: {\n instructionId: currentInstructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const { result } = await uploadResponse.json()\n if (!result) {\n throw new Error('generateUpload: Something went wrong')\n }\n\n setValue(result?.id)\n setHistory(result?.id)\n console.log('Image updated...', result)\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error: any) => error.message).join(', ')\n throw new Error(errStr)\n }\n return uploadResponse\n })\n .catch((error) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error(\n 'Error generating or setting your upload, please set it manually if its saved in your media files.',\n error\n )\n })\n }, [getData, localFromContext?.code, instructionIdRef, setValue, documentId, collectionSlug])\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if (type === 'richText') {\n return streamObject(options ?? { action: 'Compose' })\n }\n\n if (['text', 'textarea'].includes(type ?? '') && type) {\n return streamText(options ?? { action: 'Compose' })\n }\n\n if (type === 'upload') {\n return generateUpload()\n }\n },\n [generateUpload, streamObject, streamText, type],\n )\n\n const stop = useCallback(() => {\n console.log('Stopping...')\n objectStop()\n completionStop()\n }, [objectStop, completionStop])\n\n return {\n generate,\n isLoading: loadingCompletion || loadingObject,\n stop,\n }\n}\n"],"names":["useCompletion","experimental_useObject","useObject","useEditorConfigContext","toast","useConfig","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useMemo","useRef","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","PLUGIN_NAME","useFieldProps","editorSchemaValidator","setSafeLexicalState","useHistory","useGenerate","instructionId","instructionIdRef","current","type","path","pathFromContext","editorConfigContext","editor","config","routes","api","serverURL","setValue","set","setHistory","getData","id","documentId","collectionSlug","localFromContext","collections","collection","find","slug","custom","editorConfig","admin","schema","editorSchema","memoizedValidator","memoizedSchema","validate","value","isValid","success","error","Error","isLoading","loadingObject","object","stop","objectStop","submit","onError","message","console","onFinish","result","log","requestAnimationFrame","complete","completion","loadingCompletion","completionStop","prompt","streamProtocol","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","locale","code","streamText","body","generateUpload","fetch","JSON","stringify","credentials","headers","method","then","uploadResponse","ok","json","errors","errStr","map","join","catch","generate","includes"],"mappings":"AAAA,SAASA,aAAa,EAAEC,0BAA0BC,SAAS,QAAQ,gBAAe;AAClF,SAASC,sBAAsB,QAAQ,sCAAqC;AAC5E,SAASC,KAAK,EAAEC,SAAS,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,SAAS,QAAQ,iBAAgB;AAChG,SAASC,UAAU,QAAQ,KAAI;AAC/B,SAASC,WAAW,EAAEC,SAAS,EAAEC,OAAO,EAAEC,MAAM,QAAQ,QAAO;AAI/D,SACEC,4BAA4B,EAC5BC,mCAAmC,EACnCC,yBAAyB,EACzBC,WAAW,QACN,uBAAsB;AAC7B,SAASC,aAAa,QAAQ,oDAAmD;AACjF,SAASC,qBAAqB,QAAQ,8CAA6C;AACnF,SAASC,mBAAmB,QAAQ,4CAA2C;AAC/E,SAASC,UAAU,QAAQ,kBAAiB;AAI5C,OAAO,MAAMC,cAAc,CAAC,EAAEC,aAAa,EAA6B;IACtE,iDAAiD;IACjD,MAAMC,mBAAmBX,OAAOU;IAEhC,gDAAgD;IAChDZ,UAAU;QACRa,iBAAiBC,OAAO,GAAGF;IAC7B,GAAG;QAACA;KAAc;IAElB,MAAM,EAAEG,IAAI,EAAEC,MAAMC,eAAe,EAAE,GAAGV;IACxC,MAAMW,sBAAsB3B;IAE5B,MAAM,EAAE4B,MAAM,EAAE,GAAGD;IAEnB,MAAM,EAAEE,MAAM,EAAE,GAAG3B;IACnB,MAAM,EACJ4B,QAAQ,EAAEC,GAAG,EAAE,EACfC,SAAS,EACV,GAAGH;IAEJ,MAAM,EAAEI,QAAQ,EAAE,GAAG7B,SAAiB;QACpCqB,MAAMC,mBAAmB;IAC3B;IAEA,MAAM,EAAEQ,KAAKC,UAAU,EAAE,GAAGhB;IAE5B,MAAM,EAAEiB,OAAO,EAAE,GAAG/B;IACpB,MAAM,EAAEgC,IAAIC,UAAU,EAAEC,cAAc,EAAE,GAAGpC;IAE3C,MAAMqC,mBAAmBlC;IACzB,MAAM,EACJuB,QAAQ,EAAEY,WAAW,EAAE,EACxB,GAAGvC;IAEJ,MAAMwC,aAAaD,YAAYE,IAAI,CAAC,CAACD,aAAeA,WAAWE,IAAI,KAAK9B;IACxE,MAAM,EAAE+B,QAAQ,EAAE,CAAC9B,YAAY,EAAE,EAAE+B,eAAe,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,GAAGJ,YAAYK,SAAS,CAAC;IAC7F,MAAM,EAAEC,QAAQC,eAAe,CAAC,CAAC,EAAE,GAAGH;IAEtC,MAAMI,oBAAoBxC,QAAQ;QAChC,OAAOO,sBAAsBgC;IAC/B,GAAG;QAACA;KAAa;IAEjB,MAAME,iBAAiBzC,QACrB,IACEH,WAAW0C,cAAc;YACvBG,UAAU,CAACC;gBACT,MAAMC,UAAUJ,kBAAkBG;gBAElC,IAAIC,SAAS;oBACX,OAAO;wBACLC,SAAS;wBACTF;oBACF;gBACF,OAAO;oBACL,OAAO;wBACLG,OAAO,IAAIC,MAAM;wBACjBF,SAAS;oBACX;gBACF;YACF;QACF,IACF;QAACL;KAAkB;IAGrB,MAAM,EACJQ,WAAWC,aAAa,EACxBC,MAAM,EACNC,MAAMC,UAAU,EAChBC,MAAM,EACP,GAAGhE,UAAU;QACZgC,KAAK,CAAC,IAAI,EAAEnB,8BAA8B;QAC1CoD,SAAS,CAACR;YACRvD,MAAMuD,KAAK,CAAC,CAAC,oBAAoB,EAAEA,MAAMS,OAAO,EAAE;YAClDC,QAAQV,KAAK,CAAC,4BAA4BA;QAC5C;QACAW,UAAU,CAACC;YACT,IAAIA,OAAOR,MAAM,EAAE;gBACjBzB,WAAWiC,OAAOR,MAAM;gBACxB3B,SAASmC,OAAOR,MAAM;YACxB,OAAO;gBACLM,QAAQG,GAAG,CAAC,qBAAqBD;YACnC;QACF;QACApB,QAAQG;IACV;IAEA1C,UAAU;QACR,IAAI,CAACmD,QAAQ;YACX;QACF;QAEAU,sBAAsB;YACpB,0EAA0E;YAC1E,kEAAkE;YAClE,iCAAiC;YAC/BpD,oBAAoB0C,QAAQhC;QAC9B,IAAI;QACN;IACF,GAAG;QAACgC;QAAQhC;KAAO;IAEnB,MAAM,EACJ2C,QAAQ,EACRC,UAAU,EACVd,WAAWe,iBAAiB,EAC5BZ,MAAMa,cAAc,EACrB,GAAG7E,cAAc;QAChBkC,KAAK,GAAGC,YAAYD,MAAMnB,8BAA8B;QACxDoD,SAAS,CAACR;YACRvD,MAAMuD,KAAK,CAAC,CAAC,oBAAoB,EAAEA,MAAMS,OAAO,EAAE;YAClDC,QAAQV,KAAK,CAAC,0BAA0BA;QAC1C;QACAW,UAAU,CAACQ,QAAQP;YACjBjC,WAAWiC;QACb;QACAQ,gBAAgB;IAClB;IAEAnE,UAAU;QACR,IAAI,CAAC+D,YAAY;YACf;QACF;QAEAF,sBAAsB;YACpBrC,SAASuC;QACX;IACF,GAAG;QAACA;KAAW;IAEf,MAAMK,eAAerE,YACnB,CAAC,EAAEsE,SAAS,SAAS,EAAEC,MAAM,EAAwB;QACnD,MAAMC,MAAM5C;QAEZ,MAAM6C,uBAAuB3D,iBAAiBC,OAAO;QAErD,MAAM2D,UAAU;YACdJ;YACAK,cAAcJ;YACd1D,eAAe4D;QACjB;QAEAlB,OAAO;YACLqB,oBAAoBC,MAAMC,IAAI,CAAC1D,QAAQ2D,QAAQC,UAAU,EAAE;YAC3DR,KAAK;gBACH,GAAGA,GAAG;gBACN3C,IAAIC;YACN;YACAmD,QAAQjD,kBAAkBkD;YAC1BR;QACF;IACF,GACA;QAAC1C,kBAAkBkD;QAAMpE;QAAkBgB;KAAW;IAGxD,MAAMqD,aAAanF,YACjB,OAAO,EAAEsE,SAAS,SAAS,EAAEC,MAAM,EAAwB;QACzD,MAAMC,MAAM5C;QACZ,MAAM6C,uBAAuB3D,iBAAiBC,OAAO;QAErD,MAAM2D,UAAU;YACdJ;YACAK,cAAcJ;YACd1D,eAAe4D;QACjB;QAEA,MAAMV,SAAS,IAAI;YACjBqB,MAAM;gBACJZ,KAAK;oBACH,GAAGA,GAAG;oBACN3C,IAAIC;gBACN;gBACAmD,QAAQjD,kBAAkBkD;gBAC1BR;YACF;QACF;IACF,GACA;QAAC9C;QAASI,kBAAkBkD;QAAMpE;QAAkBiD;QAAUjC;KAAW;IAG3E,MAAMuD,iBAAiBrF,YAAY;QACjC,MAAMwE,MAAM5C;QACZ,MAAM6C,uBAAuB3D,iBAAiBC,OAAO;QAErD,OAAOuE,MAAM,GAAG9D,YAAYD,MAAMlB,qCAAqC,EAAE;YACvE+E,MAAMG,KAAKC,SAAS,CAAC;gBACnBzD,gBAAgBA,kBAAkB;gBAClCyC;gBACA1C;gBACAmD,QAAQjD,kBAAkBkD;gBAC1BR,SAAS;oBACP7D,eAAe4D;gBACjB;YACF;YACAgB,aAAa;YACbC,SAAS;gBACP,gBAAgB;YAClB;YACAC,QAAQ;QACV,GACGC,IAAI,CAAC,OAAOC;YACX,IAAIA,eAAeC,EAAE,EAAE;gBACrB,MAAM,EAAElC,MAAM,EAAE,GAAG,MAAMiC,eAAeE,IAAI;gBAC5C,IAAI,CAACnC,QAAQ;oBACX,MAAM,IAAIX,MAAM;gBAClB;gBAEAxB,SAASmC,QAAQ/B;gBACjBF,WAAWiC,QAAQ/B;gBACnB6B,QAAQG,GAAG,CAAC,oBAAoBD;YAClC,OAAO;gBACL,MAAM,EAAEoC,SAAS,EAAE,EAAE,GAAG,MAAMH,eAAeE,IAAI;gBACjD,MAAME,SAASD,OAAOE,GAAG,CAAC,CAAClD,QAAeA,MAAMS,OAAO,EAAE0C,IAAI,CAAC;gBAC9D,MAAM,IAAIlD,MAAMgD;YAClB;YACA,OAAOJ;QACT,GACCO,KAAK,CAAC,CAACpD;YACNvD,MAAMuD,KAAK,CAAC,CAAC,oBAAoB,EAAEA,MAAMS,OAAO,EAAE;YAClDC,QAAQV,KAAK,CACX,qGACAA;QAEJ;IACJ,GAAG;QAACpB;QAASI,kBAAkBkD;QAAMpE;QAAkBW;QAAUK;QAAYC;KAAe;IAE5F,MAAMsE,WAAWrG,YACf,OAAO0E;QACL,IAAI1D,SAAS,YAAY;YACvB,OAAOqD,aAAaK,WAAW;gBAAEJ,QAAQ;YAAU;QACrD;QAEA,IAAI;YAAC;YAAQ;SAAW,CAACgC,QAAQ,CAACtF,QAAQ,OAAOA,MAAM;YACrD,OAAOmE,WAAWT,WAAW;gBAAEJ,QAAQ;YAAU;QACnD;QAEA,IAAItD,SAAS,UAAU;YACrB,OAAOqE;QACT;IACF,GACA;QAACA;QAAgBhB;QAAcc;QAAYnE;KAAK;IAGlD,MAAMqC,OAAOrD,YAAY;QACvB0D,QAAQG,GAAG,CAAC;QACZP;QACAY;IACF,GAAG;QAACZ;QAAYY;KAAe;IAE/B,OAAO;QACLmC;QACAnD,WAAWe,qBAAqBd;QAChCE;IACF;AACF,EAAC"}
|
|
@@ -8,7 +8,7 @@ export const useHistory = ()=>{
|
|
|
8
8
|
const { id } = useDocumentInfo();
|
|
9
9
|
const { path: pathFromContext, schemaPath } = useFieldProps();
|
|
10
10
|
const { value: currentFieldValue } = useField({
|
|
11
|
-
path: pathFromContext
|
|
11
|
+
path: pathFromContext ?? ''
|
|
12
12
|
});
|
|
13
13
|
const fieldKey = `${id}.${schemaPath}`;
|
|
14
14
|
const getLatestHistory = useCallback(()=>{
|
|
@@ -34,7 +34,7 @@ export const useHistory = ()=>{
|
|
|
34
34
|
...getLatestHistory()
|
|
35
35
|
};
|
|
36
36
|
Object.keys(latestHistory).forEach((k)=>{
|
|
37
|
-
if (!k.startsWith(id?.toString())) {
|
|
37
|
+
if (!k.startsWith(id?.toString() ?? '')) {
|
|
38
38
|
delete latestHistory[k];
|
|
39
39
|
}
|
|
40
40
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useHistory.ts"],"sourcesContent":["'use client'\n\nimport { useDocumentInfo, useField } from '@payloadcms/ui'\nimport { useCallback, useEffect } from 'react'\n\nimport { PLUGIN_NAME } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\n\nconst STORAGE_KEY = `${PLUGIN_NAME}-fields-history`\n\ninterface HistoryState {\n [path: string]: {\n currentIndex: number\n history: any[]\n }\n}\n\nexport const useHistory = () => {\n const { id } = useDocumentInfo()\n const { path: pathFromContext, schemaPath } = useFieldProps()\n const { value: currentFieldValue } = useField<string>({\n path: pathFromContext,\n })\n\n const fieldKey = `${id}.${schemaPath}`\n\n const getLatestHistory = useCallback((): HistoryState => {\n try {\n // This condition is applied, as it was somehow triggering on server side\n if (typeof localStorage !== 'undefined') {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}')\n }\n return {}\n } catch (e) {\n console.error('Error parsing history:', e)\n return {}\n }\n }, [])\n\n const saveToLocalStorage = useCallback((newGlobalHistory: HistoryState) => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory))\n }\n }, [])\n\n // Clear previous history\n const clearHistory = useCallback(() => {\n const latestHistory = { ...getLatestHistory() }\n Object.keys(latestHistory).forEach((k) => {\n if (!k.startsWith(id?.toString())) {\n delete latestHistory[k]\n }\n })\n saveToLocalStorage(latestHistory)\n }, [id, fieldKey, getLatestHistory, saveToLocalStorage])\n\n useEffect(() => {\n // This is applied to clear out the document history which is not currently in use\n clearHistory()\n\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n\n let newIndex = currentIndex\n if (currentIndex == -1) {\n newIndex = 0\n if (currentFieldValue) {\n history[newIndex] = currentFieldValue\n }\n }\n\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n\n saveToLocalStorage(newGlobalHistory)\n }, [fieldKey])\n\n const set = useCallback(\n (data: any) => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n const newHistory = [...history.slice(0, currentIndex + 1), data]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newHistory.length - 1, history: newHistory },\n }\n saveToLocalStorage(newGlobalHistory)\n return data\n },\n [fieldKey, getLatestHistory, saveToLocalStorage],\n )\n\n const undo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex > 0) {\n const newIndex = currentIndex - 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const redo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex < history.length - 1) {\n const newIndex = currentIndex + 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const getLatestFieldHistory = useCallback(() => {\n const latestHistory = getLatestHistory()\n return latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n }, [getLatestHistory, fieldKey])\n\n const fieldHistory = getLatestFieldHistory()\n\n const canUndo = fieldHistory.currentIndex > 0\n const canRedo = fieldHistory.currentIndex < fieldHistory.history.length - 1\n const currentValue = fieldHistory.history[fieldHistory.currentIndex]\n\n return {\n canRedo,\n canUndo,\n currentValue,\n redo,\n set,\n undo,\n }\n}\n"],"names":["useDocumentInfo","useField","useCallback","useEffect","PLUGIN_NAME","useFieldProps","STORAGE_KEY","useHistory","id","path","pathFromContext","schemaPath","value","currentFieldValue","fieldKey","getLatestHistory","localStorage","JSON","parse","getItem","e","console","error","saveToLocalStorage","newGlobalHistory","setItem","stringify","clearHistory","latestHistory","Object","keys","forEach","k","startsWith","toString","currentIndex","history","newIndex","set","data","newHistory","slice","length","undo","newValue","undefined","redo","getLatestFieldHistory","fieldHistory","canUndo","canRedo","currentValue"],"mappings":"AAAA;AAEA,SAASA,eAAe,EAAEC,QAAQ,QAAQ,iBAAgB;AAC1D,SAASC,WAAW,EAAEC,SAAS,QAAQ,QAAO;AAE9C,SAASC,WAAW,QAAQ,uBAAsB;AAClD,SAASC,aAAa,QAAQ,oDAAmD;AAEjF,MAAMC,cAAc,GAAGF,YAAY,eAAe,CAAC;AASnD,OAAO,MAAMG,aAAa;IACxB,MAAM,EAAEC,EAAE,EAAE,GAAGR;IACf,MAAM,EAAES,MAAMC,eAAe,EAAEC,UAAU,EAAE,GAAGN;IAC9C,MAAM,EAAEO,OAAOC,iBAAiB,EAAE,GAAGZ,SAAiB;QACpDQ,MAAMC;
|
|
1
|
+
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useHistory.ts"],"sourcesContent":["'use client'\n\nimport { useDocumentInfo, useField } from '@payloadcms/ui'\nimport { useCallback, useEffect } from 'react'\n\nimport { PLUGIN_NAME } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\n\nconst STORAGE_KEY = `${PLUGIN_NAME}-fields-history`\n\ninterface HistoryState {\n [path: string]: {\n currentIndex: number\n history: any[]\n }\n}\n\nexport const useHistory = () => {\n const { id } = useDocumentInfo()\n const { path: pathFromContext, schemaPath } = useFieldProps()\n const { value: currentFieldValue } = useField<string>({\n path: pathFromContext ?? '',\n })\n\n const fieldKey = `${id}.${schemaPath}`\n\n const getLatestHistory = useCallback((): HistoryState => {\n try {\n // This condition is applied, as it was somehow triggering on server side\n if (typeof localStorage !== 'undefined') {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}')\n }\n return {}\n } catch (e) {\n console.error('Error parsing history:', e)\n return {}\n }\n }, [])\n\n const saveToLocalStorage = useCallback((newGlobalHistory: HistoryState) => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory))\n }\n }, [])\n\n // Clear previous history\n const clearHistory = useCallback(() => {\n const latestHistory = { ...getLatestHistory() }\n Object.keys(latestHistory).forEach((k) => {\n if (!k.startsWith(id?.toString() ?? '')) {\n delete latestHistory[k]\n }\n })\n saveToLocalStorage(latestHistory)\n }, [id, fieldKey, getLatestHistory, saveToLocalStorage])\n\n useEffect(() => {\n // This is applied to clear out the document history which is not currently in use\n clearHistory()\n\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n\n let newIndex = currentIndex\n if (currentIndex == -1) {\n newIndex = 0\n if (currentFieldValue) {\n history[newIndex] = currentFieldValue\n }\n }\n\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n\n saveToLocalStorage(newGlobalHistory)\n }, [fieldKey])\n\n const set = useCallback(\n (data: any) => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n const newHistory = [...history.slice(0, currentIndex + 1), data]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newHistory.length - 1, history: newHistory },\n }\n saveToLocalStorage(newGlobalHistory)\n return data\n },\n [fieldKey, getLatestHistory, saveToLocalStorage],\n )\n\n const undo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex > 0) {\n const newIndex = currentIndex - 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const redo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex < history.length - 1) {\n const newIndex = currentIndex + 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const getLatestFieldHistory = useCallback(() => {\n const latestHistory = getLatestHistory()\n return latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n }, [getLatestHistory, fieldKey])\n\n const fieldHistory = getLatestFieldHistory()\n\n const canUndo = fieldHistory.currentIndex > 0\n const canRedo = fieldHistory.currentIndex < fieldHistory.history.length - 1\n const currentValue = fieldHistory.history[fieldHistory.currentIndex]\n\n return {\n canRedo,\n canUndo,\n currentValue,\n redo,\n set,\n undo,\n }\n}\n"],"names":["useDocumentInfo","useField","useCallback","useEffect","PLUGIN_NAME","useFieldProps","STORAGE_KEY","useHistory","id","path","pathFromContext","schemaPath","value","currentFieldValue","fieldKey","getLatestHistory","localStorage","JSON","parse","getItem","e","console","error","saveToLocalStorage","newGlobalHistory","setItem","stringify","clearHistory","latestHistory","Object","keys","forEach","k","startsWith","toString","currentIndex","history","newIndex","set","data","newHistory","slice","length","undo","newValue","undefined","redo","getLatestFieldHistory","fieldHistory","canUndo","canRedo","currentValue"],"mappings":"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"}
|