@ai-stack/payloadcms 3.2.5-beta → 3.2.8-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 +13 -2
- package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -1
- package/dist/ai/models/elevenLabs/generateVoice.d.ts +1 -2
- package/dist/ai/models/elevenLabs/generateVoice.d.ts.map +1 -1
- package/dist/ai/models/elevenLabs/generateVoice.js.map +1 -1
- package/dist/ai/models/index.d.ts +1 -1
- package/dist/ai/models/index.d.ts.map +1 -1
- package/dist/ai/models/index.js +1 -1
- package/dist/ai/models/index.js.map +1 -1
- package/dist/ai/models/openai/generateImage.d.ts.map +1 -1
- package/dist/ai/models/openai/generateRichText.d.ts.map +1 -1
- package/dist/ai/models/openai/generateRichText.js +5 -9
- package/dist/ai/models/openai/generateRichText.js.map +1 -1
- package/dist/ai/models/openai/generateVoice.d.ts +1 -1
- package/dist/ai/models/openai/generateVoice.d.ts.map +1 -1
- package/dist/ai/models/openai/index.d.ts.map +1 -1
- package/dist/ai/models/openai/index.js +1 -1
- package/dist/ai/models/openai/index.js.map +1 -1
- package/dist/ai/models/openai/openai.d.ts +2 -0
- package/dist/ai/models/openai/openai.d.ts.map +1 -0
- package/dist/ai/models/openai/openai.js +9 -0
- package/dist/ai/models/openai/openai.js.map +1 -0
- package/dist/ai/prompts.d.ts.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.d.ts +4 -0
- package/dist/ai/schemas/lexicalJsonSchema.d.ts.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.js +8 -0
- package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
- package/dist/ai/utils/systemGenerate.d.ts +1 -1
- package/dist/ai/utils/systemGenerate.d.ts.map +1 -1
- package/dist/ai/utils/systemGenerate.js +6 -2
- package/dist/ai/utils/systemGenerate.js.map +1 -1
- package/dist/collections/Instructions.d.ts +2 -1
- package/dist/collections/Instructions.d.ts.map +1 -1
- package/dist/collections/Instructions.js +24 -21
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/endpoints/index.d.ts +2 -2
- package/dist/endpoints/index.d.ts.map +1 -1
- package/dist/endpoints/index.js +97 -96
- package/dist/endpoints/index.js.map +1 -1
- package/dist/exports/types.d.ts +1 -1
- package/dist/exports/types.d.ts.map +1 -1
- package/dist/exports/types.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.d.ts +1 -2
- package/dist/fields/ComposeField/ComposeField.d.ts.map +1 -1
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -1
- package/dist/fields/LexicalEditor/feature.client.d.ts.map +1 -1
- package/dist/fields/LexicalEditor/feature.client.js.map +1 -1
- package/dist/fields/LexicalEditor/feature.server.d.ts.map +1 -1
- package/dist/fields/LexicalEditor/feature.server.js +2 -3
- package/dist/fields/LexicalEditor/feature.server.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.js +5 -1
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/SelectField/SelectField.d.ts.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +5 -3
- package/dist/init.js.map +1 -1
- package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts.map +1 -1
- package/dist/libraries/handlebars/helpers.d.ts.map +1 -1
- package/dist/libraries/handlebars/replacePlaceholders.d.ts +1 -1
- package/dist/libraries/handlebars/replacePlaceholders.d.ts.map +1 -1
- package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
- package/dist/plugin.d.ts.map +1 -1
- package/dist/plugin.js +10 -5
- package/dist/plugin.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.d.ts.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.d.ts.map +1 -1
- package/dist/types.d.ts +3 -1
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.d.ts +7 -3
- package/dist/ui/Compose/Compose.d.ts.map +1 -1
- package/dist/ui/Compose/Compose.js +37 -15
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.d.ts.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.js +9 -9
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/compose.module.css +2 -0
- package/dist/ui/Compose/hooks/menu/Item.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js +2 -4
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.js +22 -9
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Icons/Icons.d.ts.map +1 -1
- package/dist/ui/Icons/LottieAnimation.d.ts.map +1 -1
- package/dist/utilities/editorSchemaValidator.d.ts.map +1 -1
- package/dist/utilities/editorSchemaValidator.js +2 -1
- package/dist/utilities/editorSchemaValidator.js.map +1 -1
- package/dist/utilities/getFieldBySchemaPath.d.ts.map +1 -1
- package/dist/utilities/getFieldInfo.d.ts.map +1 -1
- package/dist/utilities/getGenerationModels.d.ts +3 -0
- package/dist/utilities/getGenerationModels.d.ts.map +1 -0
- package/dist/utilities/getGenerationModels.js +10 -0
- package/dist/utilities/getGenerationModels.js.map +1 -0
- package/dist/utilities/isPluginActivated.d.ts +2 -1
- package/dist/utilities/isPluginActivated.d.ts.map +1 -1
- package/dist/utilities/isPluginActivated.js +3 -2
- package/dist/utilities/isPluginActivated.js.map +1 -1
- package/dist/utilities/setSafeLexicalState.d.ts.map +1 -1
- package/dist/utilities/setSafeLexicalState.js +1 -1
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/dist/utilities/updateFieldsConfig.d.ts.map +1 -1
- package/package.json +8 -7
package/dist/plugin.js
CHANGED
|
@@ -8,10 +8,13 @@ import { init } from './init.js';
|
|
|
8
8
|
import { translations } from './translations/index.js';
|
|
9
9
|
import { isPluginActivated } from './utilities/isPluginActivated.js';
|
|
10
10
|
import { updateFieldsConfig } from './utilities/updateFieldsConfig.js';
|
|
11
|
+
import { defaultGenerationModels } from './ai/models/index.js';
|
|
12
|
+
import { getGenerationModels } from './utilities/getGenerationModels.js';
|
|
11
13
|
const defaultPluginConfig = {
|
|
12
14
|
collections: {},
|
|
13
15
|
disableSponsorMessage: false,
|
|
14
|
-
generatePromptOnInit: true
|
|
16
|
+
generatePromptOnInit: true,
|
|
17
|
+
generationModels: defaultGenerationModels
|
|
15
18
|
};
|
|
16
19
|
const sponsorMessage = `
|
|
17
20
|
╔═══════════════════════════════════════════════════════════════╗
|
|
@@ -37,13 +40,14 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
37
40
|
...defaultPluginConfig,
|
|
38
41
|
...pluginConfig
|
|
39
42
|
};
|
|
40
|
-
|
|
43
|
+
pluginConfig.generationModels = getGenerationModels(pluginConfig);
|
|
44
|
+
const isActivated = isPluginActivated(pluginConfig);
|
|
41
45
|
let updatedConfig = {
|
|
42
46
|
...incomingConfig
|
|
43
47
|
};
|
|
44
48
|
let collectionsFieldPathMap = {};
|
|
45
49
|
if (isActivated) {
|
|
46
|
-
const Instructions = instructionsCollection();
|
|
50
|
+
const Instructions = instructionsCollection(pluginConfig);
|
|
47
51
|
// Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit
|
|
48
52
|
const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes);
|
|
49
53
|
if (pluginConfig.debugging) {
|
|
@@ -77,6 +81,7 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
77
81
|
providers: updatedProviders
|
|
78
82
|
}
|
|
79
83
|
};
|
|
84
|
+
const pluginEndpoints = endpoints(pluginConfig);
|
|
80
85
|
updatedConfig = {
|
|
81
86
|
...incomingConfig,
|
|
82
87
|
collections: collections.map((collection)=>{
|
|
@@ -92,8 +97,8 @@ const payloadAiPlugin = (pluginConfig)=>(incomingConfig)=>{
|
|
|
92
97
|
}),
|
|
93
98
|
endpoints: [
|
|
94
99
|
...incomingConfig.endpoints ?? [],
|
|
95
|
-
|
|
96
|
-
|
|
100
|
+
pluginEndpoints.textarea,
|
|
101
|
+
pluginEndpoints.upload,
|
|
97
102
|
fetchFields
|
|
98
103
|
],
|
|
99
104
|
i18n: {
|
package/dist/plugin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\n\nconst defaultPluginConfig: PluginConfig = {\n collections: {},\n disableSponsorMessage: false,\n generatePromptOnInit: true,\n}\n\nconst sponsorMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║\n║ ║\n║ If this plugin makes your life easier, please ║\n║ consider supporting its development and maintenance: ║\n║ ║\n║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║\n║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║\n║ ║\n║ Your support fuels continued improvements, ║\n║ new features, and more caffeinated coding sessions! ☕ ║\n║ ║\n║ Got feedback or need help? Submit an issue here: ║\n║ • https://github.com/ashbuilds/payload-ai/issues/new ║\n║ ║\n║ Thank you again, and happy building! ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n pluginConfig = { ...defaultPluginConfig, ...pluginConfig }\n const isActivated = isPluginActivated()\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\n if (isActivated) {\n const Instructions = instructionsCollection()\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions]\n const { collections: collectionSlugs = [] } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n updatedConfig = {\n ...incomingConfig,\n collections: collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig\n }\n\n return collection\n }),\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n
|
|
1
|
+
{"version":3,"sources":["../src/plugin.ts"],"sourcesContent":["import type { Config } from 'payload'\n\nimport { deepMerge } from 'payload/shared'\n\nimport type { PluginConfig } from './types.js'\n\nimport { lexicalJsonSchema } from './ai/schemas/lexicalJsonSchema.js'\nimport { instructionsCollection } from './collections/Instructions.js'\nimport { PLUGIN_NAME } from './defaults.js'\nimport { fetchFields } from './endpoints/fetchFields.js'\nimport { endpoints } from './endpoints/index.js'\nimport { init } from './init.js'\nimport { translations } from './translations/index.js'\nimport { isPluginActivated } from './utilities/isPluginActivated.js'\nimport { updateFieldsConfig } from './utilities/updateFieldsConfig.js'\nimport { defaultGenerationModels } from './ai/models/index.js'\nimport { getGenerationModels } from './utilities/getGenerationModels.js'\n\nconst defaultPluginConfig: PluginConfig = {\n collections: {},\n disableSponsorMessage: false,\n generatePromptOnInit: true,\n generationModels: defaultGenerationModels\n}\n\nconst sponsorMessage = `\n╔═══════════════════════════════════════════════════════════════╗\n║ THANK YOU FOR USING THE PAYLOAD AI PLUGIN! ║\n║ ║\n║ If this plugin makes your life easier, please ║\n║ consider supporting its development and maintenance: ║\n║ ║\n║ • Buy me a coffee: https://buymeacoffee.com/ashbuilds ║\n║ • Sponsor on GitHub: https://github.com/sponsors/ashbuilds ║\n║ ║\n║ Your support fuels continued improvements, ║\n║ new features, and more caffeinated coding sessions! ☕ ║\n║ ║\n║ Got feedback or need help? Submit an issue here: ║\n║ • https://github.com/ashbuilds/payload-ai/issues/new ║\n║ ║\n║ Thank you again, and happy building! ║\n╚═══════════════════════════════════════════════════════════════╝\n`\n\nconst payloadAiPlugin =\n (pluginConfig: PluginConfig) =>\n (incomingConfig: Config): Config => {\n pluginConfig = { ...defaultPluginConfig, ...pluginConfig }\n pluginConfig.generationModels = getGenerationModels(pluginConfig)\n const isActivated = isPluginActivated(pluginConfig)\n let updatedConfig: Config = { ...incomingConfig }\n let collectionsFieldPathMap = {}\n if (isActivated) {\n const Instructions = instructionsCollection(pluginConfig)\n // Inject editor schema to config, so that it can be accessed when /textarea endpoint will hit\n const lexicalSchema = lexicalJsonSchema(pluginConfig.editorConfig?.nodes)\n\n if (pluginConfig.debugging) {\n Instructions.admin.hidden = false\n }\n\n Instructions.admin.custom = {\n ...(Instructions.admin.custom || {}),\n [PLUGIN_NAME]: {\n editorConfig: {\n // Used in admin client for useObject hook\n schema: lexicalSchema,\n },\n },\n }\n\n const collections = [...(incomingConfig.collections ?? []), Instructions]\n const { collections: collectionSlugs = [] } = pluginConfig\n\n const { components: { providers = [] } = {} } = incomingConfig.admin || {}\n const updatedProviders = [\n ...(providers ?? []),\n {\n path: '@ai-stack/payloadcms/client#InstructionsProvider',\n },\n ]\n\n incomingConfig.admin = {\n ...(incomingConfig.admin || {}),\n components: {\n ...(incomingConfig.admin?.components ?? {}),\n providers: updatedProviders,\n },\n }\n\n const pluginEndpoints = endpoints(pluginConfig)\n updatedConfig = {\n ...incomingConfig,\n collections: collections.map((collection) => {\n if (collectionSlugs[collection.slug]) {\n const { schemaPathMap, updatedCollectionConfig } = updateFieldsConfig(collection)\n collectionsFieldPathMap = {\n ...collectionsFieldPathMap,\n ...schemaPathMap,\n }\n return updatedCollectionConfig\n }\n\n return collection\n }),\n endpoints: [\n ...(incomingConfig.endpoints ?? []),\n pluginEndpoints.textarea,\n pluginEndpoints.upload,\n fetchFields,\n ],\n i18n: {\n ...(incomingConfig.i18n || {}),\n translations: {\n ...deepMerge(translations, incomingConfig.i18n?.translations ?? {}),\n },\n },\n }\n }\n\n updatedConfig.onInit = async (payload) => {\n if (incomingConfig.onInit) await incomingConfig.onInit(payload)\n\n if (!isActivated) {\n payload.logger.warn(`— AI Plugin: Not activated. Please verify your environment keys.`)\n return\n }\n\n await init(payload, collectionsFieldPathMap, pluginConfig)\n .catch((error) => {\n console.error(error)\n payload.logger.error(`— AI Plugin: Initialization Error: ${error}`)\n })\n .finally(() => {\n if (!pluginConfig.disableSponsorMessage) {\n setTimeout(() => {\n payload.logger.info(sponsorMessage)\n }, 3000)\n }\n })\n }\n\n return updatedConfig\n }\n\nexport { payloadAiPlugin }\n"],"names":["deepMerge","lexicalJsonSchema","instructionsCollection","PLUGIN_NAME","fetchFields","endpoints","init","translations","isPluginActivated","updateFieldsConfig","defaultGenerationModels","getGenerationModels","defaultPluginConfig","collections","disableSponsorMessage","generatePromptOnInit","generationModels","sponsorMessage","payloadAiPlugin","pluginConfig","incomingConfig","isActivated","updatedConfig","collectionsFieldPathMap","Instructions","lexicalSchema","editorConfig","nodes","debugging","admin","hidden","custom","schema","collectionSlugs","components","providers","updatedProviders","path","pluginEndpoints","map","collection","slug","schemaPathMap","updatedCollectionConfig","textarea","upload","i18n","onInit","payload","logger","warn","catch","error","console","finally","setTimeout","info"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FieldProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/FieldProvider/FieldProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmC,MAAM,OAAO,CAAA;AAYvD,eAAO,MAAM,YAAY;WAThB,MAAM;iBACA,MAAM;WACZ,MAAM;EAO0C,CAAA;AAEzD,eAAO,MAAM,aAAa,
|
|
1
|
+
{"version":3,"file":"FieldProvider.d.ts","sourceRoot":"","sources":["../../../src/providers/FieldProvider/FieldProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmC,MAAM,OAAO,CAAA;AAYvD,eAAO,MAAM,YAAY;WAThB,MAAM;iBACA,MAAM;WACZ,MAAM;EAO0C,CAAA;AAEzD,eAAO,MAAM,aAAa,GAAI,wBAG3B;IACD,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,IAAI,EAAE,OAAO,CAAA;KAAE,CAAA;CAC9D,4CAwBA,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInstructions.d.ts","sourceRoot":"","sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"useInstructions.d.ts","sourceRoot":"","sources":["../../../src/providers/InstructionsProvider/useInstructions.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,eAAe,GAC1B,SAAQ;IACN,UAAU,CAAC,EAAE,OAAO,CAAA;CAChB,QAgDP,CAAA"}
|
package/dist/types.d.ts
CHANGED
|
@@ -12,17 +12,19 @@ export interface PluginConfig {
|
|
|
12
12
|
};
|
|
13
13
|
fields?: Field[];
|
|
14
14
|
generatePromptOnInit?: boolean;
|
|
15
|
+
generationModels?: ((defaultModels: GenerationModel[]) => GenerationModel[]) | GenerationModel[];
|
|
15
16
|
globals?: string[];
|
|
16
17
|
interfaceName?: string;
|
|
17
18
|
}
|
|
18
19
|
export interface GenerationModel {
|
|
19
20
|
fields: string[];
|
|
20
|
-
handler?: (
|
|
21
|
+
handler?: (prompt: string, options: any) => Promise<any>;
|
|
21
22
|
id: string;
|
|
22
23
|
name: string;
|
|
23
24
|
output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video';
|
|
24
25
|
settings?: GroupField;
|
|
25
26
|
supportsPromptOptimization?: boolean;
|
|
27
|
+
generateText?: (prompt: string, system: string) => Promise<string>;
|
|
26
28
|
}
|
|
27
29
|
export interface GenerationConfig {
|
|
28
30
|
models: GenerationModel[];
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAE7D,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,CAAA;IACtC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACvD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAA;AAC1D,OAAO,KAAK,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,OAAO,CAAA;AAE7D,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE;QACX,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;KACvB,CAAA;IACD,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,qBAAqB,CAAC,EAAE,OAAO,CAAA;IAC/B,YAAY,CAAC,EAAE;QAAE,KAAK,EAAE,UAAU,EAAE,CAAA;KAAE,CAAA;IACtC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAA;IAChB,oBAAoB,CAAC,EAAE,OAAO,CAAA;IAC9B,gBAAgB,CAAC,EAAE,CAAC,CAAC,aAAa,EAAE,eAAe,EAAE,KAAK,eAAe,EAAE,CAAC,GAAG,eAAe,EAAE,CAAA;IAChG,OAAO,CAAC,EAAE,MAAM,EAAE,CAAA;IAClB,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,EAAE,CAAA;IAChB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,KAAK,OAAO,CAAC,GAAG,CAAC,CAAA;IACxD,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IAC9D,QAAQ,CAAC,EAAE,UAAU,CAAA;IACrB,0BAA0B,CAAC,EAAE,OAAO,CAAA;IACpC,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAA;CACnE;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,eAAe,EAAE,CAAA;IACzB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,MAAM,MAAM,gBAAgB,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;IAC7C,GAAG,EAAE,CAAC,CAAA;IACN,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,GAAG,CAAA;CACd,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,MAAM,CAAA;AAE9B,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,MAAM,CAAA;IACzB,EAAE,EAAE,MAAM,CAAA;IACV,UAAU,EAAE,MAAM,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;CACf;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;IAChC,MAAM,EAAE,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAA;CAC/B;AAED,MAAM,MAAM,eAAe,GACvB,SAAS,GACT,QAAQ,GACR,WAAW,GACX,UAAU,GACV,UAAU,GACV,UAAU,GACV,WAAW,GACX,MAAM,GACN,WAAW,CAAA;AAEf,MAAM,MAAM,gBAAgB,GACxB,WAAW,GACX,UAAU,GACV,aAAa,GACb,YAAY,GACZ,YAAY,GACZ,YAAY,GACZ,aAAa,GACb,QAAQ,GACR,aAAa,CAAA;AAEjB,MAAM,MAAM,aAAa,GAAG;KACzB,GAAG,IAAI,gBAAgB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI;CACrD,CAAA;AAED,MAAM,MAAM,aAAa,CAAC,CAAC,GAAG,GAAG,IAAI;IACnC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAA;IAC1B,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;IACjC,YAAY,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IAC/C,YAAY,CAAC,EAAE,iBAAiB,CAAC,CAAC,CAAC,GAAG,SAAS,CAAA;IAC/C,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;IACjC,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAA"}
|
package/dist/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { Endpoint, Field, GroupField } from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nexport interface PluginConfig {\n collections: {\n [key: string]: boolean\n }\n debugging?: boolean\n disableSponsorMessage?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n globals?: string[]\n interfaceName?: string\n}\n\nexport interface GenerationModel {\n fields: string[]\n handler?: (
|
|
1
|
+
{"version":3,"sources":["../src/types.ts"],"sourcesContent":["import type { JSONSchema } from 'openai/lib/jsonschema'\nimport type { Endpoint, Field, GroupField } from 'payload'\nimport type { CSSProperties, MouseEventHandler } from 'react'\n\nexport interface PluginConfig {\n collections: {\n [key: string]: boolean\n }\n debugging?: boolean\n disableSponsorMessage?: boolean\n editorConfig?: { nodes: JSONSchema[] }\n fields?: Field[]\n generatePromptOnInit?: boolean\n generationModels?: ((defaultModels: GenerationModel[]) => GenerationModel[]) | GenerationModel[]\n globals?: string[]\n interfaceName?: string\n}\n\nexport interface GenerationModel {\n fields: string[]\n handler?: (prompt: string, options: any) => Promise<any>\n id: string\n name: string\n output: 'audio' | 'file' | 'image' | 'json' | 'text' | 'video'\n settings?: GroupField\n supportsPromptOptimization?: boolean\n generateText?: (prompt: string, system: string) => Promise<string>\n}\n\nexport interface GenerationConfig {\n models: GenerationModel[]\n provider: string\n}\n\nexport type GenerateTextarea<T = any> = (args: {\n doc: T\n locale?: string\n options?: any\n}) => Promise<string> | string\n\nexport interface Instructions {\n 'collection-slug': string\n id: string\n 'model-id': string\n prompt: string\n}\n\nexport interface Endpoints {\n textarea: Omit<Endpoint, 'root'>\n upload: Omit<Endpoint, 'root'>\n}\n\nexport type ActionMenuItems =\n | 'Compose'\n | 'Expand'\n | 'Proofread'\n | 'Rephrase'\n | 'Settings'\n | 'Simplify'\n | 'Summarize'\n | 'Tone'\n | 'Translate'\n\nexport type ActionMenuEvents =\n | 'onCompose'\n | 'onExpand'\n | 'onProofread'\n | 'onRephrase'\n | 'onSettings'\n | 'onSimplify'\n | 'onSummarize'\n | 'onTone'\n | 'onTranslate'\n\nexport type UseMenuEvents = {\n [key in ActionMenuEvents]?: (data?: unknown) => void\n}\n\nexport type BaseItemProps<T = any> = {\n children?: React.ReactNode\n disabled?: boolean\n hideIcon?: boolean\n isActive?: boolean\n isMenu?: boolean\n onClick: (data?: unknown) => void\n onMouseEnter?: MouseEventHandler<T> | undefined\n onMouseLeave?: MouseEventHandler<T> | undefined\n style?: CSSProperties | undefined\n title?: string\n}\n"],"names":[],"mappings":"AA8EA,WAWC"}
|
|
@@ -1,7 +1,11 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
import
|
|
1
|
+
import type { ClientField } from 'payload';
|
|
2
|
+
import { FC } from 'react';
|
|
3
3
|
type ComposeProps = {
|
|
4
|
-
descriptionProps?:
|
|
4
|
+
descriptionProps?: {
|
|
5
|
+
field: ClientField;
|
|
6
|
+
path: string;
|
|
7
|
+
schemaPath: string;
|
|
8
|
+
};
|
|
5
9
|
instructionId: string;
|
|
6
10
|
};
|
|
7
11
|
export declare const Compose: FC<ComposeProps>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Compose.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/Compose.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Compose.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/Compose.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAC1C,OAAO,EAAE,EAAE,EAAW,MAAM,OAAO,CAAA;AA6BnC,KAAK,YAAY,GAAG;IAClB,gBAAgB,CAAC,EAAE;QACjB,KAAK,EAAE,WAAW,CAAA;QAClB,IAAI,EAAE,MAAM,CAAA;QACZ,UAAU,EAAE,MAAM,CAAA;KACnB,CAAA;IACD,aAAa,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,OAAO,EAAE,EAAE,CAAC,YAAY,CAgLpC,CAAA"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useMemo } from 'react';
|
|
3
4
|
import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
|
|
4
5
|
import { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui';
|
|
5
6
|
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
@@ -53,7 +54,8 @@ export const Compose = ({ descriptionProps, instructionId })=>{
|
|
|
53
54
|
useEffect(()=>{
|
|
54
55
|
if (!input || !actionsRef.current) return;
|
|
55
56
|
actionsRef.current.classList.add(styles.actions_hidden);
|
|
56
|
-
|
|
57
|
+
// Create the handler function
|
|
58
|
+
const clickHandler = (event)=>{
|
|
57
59
|
document.querySelectorAll('.ai-plugin-active')?.forEach((element)=>{
|
|
58
60
|
const actionElement = element.querySelector(`.${styles.actions}`);
|
|
59
61
|
if (actionElement) {
|
|
@@ -63,8 +65,16 @@ export const Compose = ({ descriptionProps, instructionId })=>{
|
|
|
63
65
|
});
|
|
64
66
|
actionsRef.current.classList.remove(styles.actions_hidden);
|
|
65
67
|
const parentWithClass = findParentWithClass(event.target, 'field-type');
|
|
66
|
-
parentWithClass
|
|
67
|
-
|
|
68
|
+
if (parentWithClass) {
|
|
69
|
+
parentWithClass.classList.add('ai-plugin-active');
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
// Add the event listener
|
|
73
|
+
input.addEventListener('click', clickHandler);
|
|
74
|
+
// Clean up the event listener when the component unmounts or input changes
|
|
75
|
+
return ()=>{
|
|
76
|
+
input.removeEventListener('click', clickHandler);
|
|
77
|
+
};
|
|
68
78
|
}, [
|
|
69
79
|
input,
|
|
70
80
|
actionsRef
|
|
@@ -131,6 +141,29 @@ export const Compose = ({ descriptionProps, instructionId })=>{
|
|
|
131
141
|
}
|
|
132
142
|
// DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo
|
|
133
143
|
}, []);
|
|
144
|
+
const popupRender = useCallback(({ close })=>{
|
|
145
|
+
return /*#__PURE__*/ _jsx(Menu, {
|
|
146
|
+
isLoading: isProcessing || isLoading,
|
|
147
|
+
onClose: close
|
|
148
|
+
});
|
|
149
|
+
}, [
|
|
150
|
+
isProcessing,
|
|
151
|
+
isLoading,
|
|
152
|
+
Menu
|
|
153
|
+
]);
|
|
154
|
+
const memoizedPopup = useMemo(()=>{
|
|
155
|
+
return /*#__PURE__*/ _jsx(Popup, {
|
|
156
|
+
button: /*#__PURE__*/ _jsx(PluginIcon, {
|
|
157
|
+
isLoading: isProcessing || isLoading
|
|
158
|
+
}),
|
|
159
|
+
render: popupRender,
|
|
160
|
+
verticalAlign: "bottom"
|
|
161
|
+
});
|
|
162
|
+
}, [
|
|
163
|
+
popupRender,
|
|
164
|
+
isProcessing,
|
|
165
|
+
isLoading
|
|
166
|
+
]);
|
|
134
167
|
return /*#__PURE__*/ _jsxs(React.Fragment, {
|
|
135
168
|
children: [
|
|
136
169
|
/*#__PURE__*/ _jsxs("label", {
|
|
@@ -144,18 +177,7 @@ export const Compose = ({ descriptionProps, instructionId })=>{
|
|
|
144
177
|
closeDrawer();
|
|
145
178
|
}
|
|
146
179
|
}),
|
|
147
|
-
|
|
148
|
-
button: /*#__PURE__*/ _jsx(PluginIcon, {
|
|
149
|
-
isLoading: isProcessing || isLoading
|
|
150
|
-
}),
|
|
151
|
-
render: ({ close })=>{
|
|
152
|
-
return /*#__PURE__*/ _jsx(Menu, {
|
|
153
|
-
isLoading: isProcessing || isLoading,
|
|
154
|
-
onClose: close
|
|
155
|
-
});
|
|
156
|
-
},
|
|
157
|
-
verticalAlign: "bottom"
|
|
158
|
-
}),
|
|
180
|
+
memoizedPopup,
|
|
159
181
|
/*#__PURE__*/ _jsx(ActiveComponent, {
|
|
160
182
|
isLoading: isProcessing || isLoading,
|
|
161
183
|
stop: stop
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldDescriptionServerProps } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype ComposeProps = {\n descriptionProps?: FieldDescriptionServerProps\n instructionId: string\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId }) => {\n const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const {\n field: { type: fieldType },\n path: pathFromContext,\n schemaPath,\n } = descriptionProps || ({} as FieldDescriptionServerProps)\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // Below snippet is used to show/hide the actions menu on AI enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n input.addEventListener('click', (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n parentWithClass.classList.add('ai-plugin-active')\n })\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading, stop } = useGenerate({ instructionId })\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: openDrawer,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo\n }, [])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n }}\n verticalAlign=\"bottom\"\n />\n <ActiveComponent isLoading={isProcessing || isLoading} stop={stop} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render incoming description field*/}\n {descriptionProps ? (\n <div>\n <FieldDescription {...descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","React","useCallback","useEffect","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","descriptionProps","instructionId","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","field","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","addEventListener","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","isProcessing","setIsProcessing","generate","isLoading","stop","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","Fragment","label","onClick","e","preventDefault","ref","role","onSave","button","render","close","onClose","verticalAlign","onChange","div"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport { FC, useMemo } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { FieldDescription, Popup, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n instructionId: string\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId }) => {\n const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const {\n field: { type: fieldType },\n path: pathFromContext,\n schemaPath,\n } = descriptionProps || {}\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // Below snippet is used to show/hide the actions menu on AI enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n\n // Create the handler function\n const clickHandler = (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n if (parentWithClass) {\n parentWithClass.classList.add('ai-plugin-active')\n }\n }\n\n // Add the event listener\n input.addEventListener('click', clickHandler)\n\n // Clean up the event listener when the component unmounts or input changes\n return () => {\n input.removeEventListener('click', clickHandler)\n }\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading, stop } = useGenerate({ instructionId })\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: openDrawer,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo\n }, [])\n\n const popupRender = useCallback(\n ({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isProcessing, isLoading])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n {memoizedPopup}\n <ActiveComponent isLoading={isProcessing || isLoading} stop={stop} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render incoming description field*/}\n {descriptionProps ? (\n <div>\n <FieldDescription {...descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useMemo","useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","React","useCallback","useEffect","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","descriptionProps","instructionId","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","field","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","clickHandler","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","addEventListener","removeEventListener","isProcessing","setIsProcessing","generate","isLoading","stop","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","popupRender","close","onClose","memoizedPopup","button","render","verticalAlign","Fragment","label","onClick","e","preventDefault","ref","role","onSave","onChange","div"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UndoRedoActions.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"UndoRedoActions.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,eAAe,GAAI,cAAc;IAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,4CA0DjF,CAAA"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { jsx as _jsx, jsxs as _jsxs
|
|
2
|
-
import { useHistory } from './hooks/useHistory.js';
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
2
|
import React, { useCallback, useEffect, useState } from 'react';
|
|
3
|
+
import { useHistory } from './hooks/useHistory.js';
|
|
4
4
|
export const UndoRedoActions = ({ onChange })=>{
|
|
5
5
|
const { canRedo, canUndo, redo, undo } = useHistory();
|
|
6
6
|
const redoHistoryValue = useCallback((event)=>{
|
|
@@ -27,26 +27,26 @@ export const UndoRedoActions = ({ onChange })=>{
|
|
|
27
27
|
setIsMounted(true);
|
|
28
28
|
}, []);
|
|
29
29
|
if (!isMounted || !canUndo && !canRedo) return null;
|
|
30
|
-
return /*#__PURE__*/ _jsxs(
|
|
30
|
+
return /*#__PURE__*/ _jsxs(React.Fragment, {
|
|
31
31
|
children: [
|
|
32
32
|
/*#__PURE__*/ _jsx("button", {
|
|
33
|
-
onClick: undoHistoryValue,
|
|
34
|
-
type: "button",
|
|
35
|
-
disabled: !canUndo,
|
|
36
33
|
className: `btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`,
|
|
34
|
+
disabled: !canUndo,
|
|
35
|
+
onClick: undoHistoryValue,
|
|
37
36
|
style: {
|
|
38
37
|
marginBlock: 0
|
|
39
38
|
},
|
|
39
|
+
type: "button",
|
|
40
40
|
children: "Undo"
|
|
41
41
|
}),
|
|
42
42
|
/*#__PURE__*/ _jsx("button", {
|
|
43
|
-
onClick: redoHistoryValue,
|
|
44
|
-
type: "button",
|
|
45
|
-
disabled: !canRedo,
|
|
46
43
|
className: `btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`,
|
|
44
|
+
disabled: !canRedo,
|
|
45
|
+
onClick: redoHistoryValue,
|
|
47
46
|
style: {
|
|
48
47
|
marginBlock: 0
|
|
49
48
|
},
|
|
49
|
+
type: "button",
|
|
50
50
|
children: "Redo"
|
|
51
51
|
})
|
|
52
52
|
]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler} from 'react';\n\nimport React, { useCallback, useEffect, useState } from 'react'\n\nimport { useHistory } from './hooks/useHistory.js'\n\nexport const UndoRedoActions = ({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) return null\n\n return (\n <React.Fragment>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n disabled={!canUndo}\n onClick={undoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Undo\n </button>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n disabled={!canRedo}\n onClick={redoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Redo\n </button>\n </React.Fragment>\n )\n}\n"],"names":["React","useCallback","useEffect","useState","useHistory","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","Fragment","button","className","disabled","onClick","style","marginBlock","type"],"mappings":";AAEA,OAAOA,SAASC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAE/D,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,QAAQ,EAAwC;IAChF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGN;IAEzC,MAAMO,mBAAmBV,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;KAAK;IAGR,MAAMM,mBAAmBd,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;KAAK;IAGR,8DAA8D;IAC9D,MAAM,CAACM,WAAWC,aAAa,GAAGd,SAAS;IAE3CD,UAAU;QACRe,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU,OAAO;IAEjD,qBACE,MAACP,MAAMkB,QAAQ;;0BACb,KAACC;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACZ,WAAW,iBAAiB;gBACpFa,UAAU,CAACb;gBACXc,SAASP;gBACTQ,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;0BAGD,KAACN;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACb,WAAW,iBAAiB;gBACpFc,UAAU,CAACd;gBACXe,SAASX;gBACTY,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;;;AAKP,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/Item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAA;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAKzD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAaxC,CAAA;AAED,eAAO,MAAM,cAAc,
|
|
1
|
+
{"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/Item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAA;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAKzD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAaxC,CAAA;AAED,eAAO,MAAM,cAAc,GAAI,kBAAa,EAAE,gBAAW,4FACW,aAAa,6CAM7E,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TranslateMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa;;
|
|
1
|
+
{"version":3,"file":"TranslateMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,GAAI;;CAAW,4CA0ExC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAoB1E,eAAO,MAAM,OAAO,
|
|
1
|
+
{"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAoB1E,eAAO,MAAM,OAAO,GAAI,YAAY,aAAa;;;;;;;;;CAwFhD,CAAA"}
|
|
@@ -67,8 +67,7 @@ export const useMenu = (menuEvents)=>{
|
|
|
67
67
|
});
|
|
68
68
|
};
|
|
69
69
|
}, [
|
|
70
|
-
activeComponent
|
|
71
|
-
menuEvents
|
|
70
|
+
activeComponent
|
|
72
71
|
]);
|
|
73
72
|
const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>i.name !== activeComponent && !i.excludedFor?.includes(fieldType)), [
|
|
74
73
|
activeComponent,
|
|
@@ -93,8 +92,7 @@ export const useMenu = (menuEvents)=>{
|
|
|
93
92
|
})
|
|
94
93
|
});
|
|
95
94
|
}, [
|
|
96
|
-
filteredMenuItems
|
|
97
|
-
menuEvents
|
|
95
|
+
filteredMenuItems
|
|
98
96
|
]);
|
|
99
97
|
return {
|
|
100
98
|
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 } 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 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Compose':\n return Compose\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents) => {\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 }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent\n hideIcon\n onClick={(data) => {\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
|
|
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 } 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 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Compose':\n return Compose\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents) => {\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 }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent\n hideIcon\n onClick={(data) => {\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])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => i.name !== activeComponent && !i.excludedFor?.includes(fieldType)),\n [activeComponent, fieldType],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }) => (\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) => {\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])\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","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","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,QAAQ,iBAAgB;AACzC,OAAOC,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI3D,SAASC,aAAa,QAAQ,uDAAsD;AACpF,SAASC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,aAAY;AACzD,SAASC,YAAY,QAAQ,gBAAe;AAC5C,OAAOC,YAAY,qBAAoB;AAEvC,MAAMC,qBAAqB,CAACC;IAC1B,OAAQA;QACN,KAAK;YACH,OAAOL;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOF;QACT;YACE,OAAOE;IACX;AACF;AAEA,OAAO,MAAMK,UAAU,CAACC;IACtB,MAAM,EAAEC,MAAMC,SAAS,EAAEC,MAAMC,eAAe,EAAE,GAAGb;IACnD,MAAMc,QAAQnB,SAAS;QAAEiB,MAAMC;IAAgB;IAC/C,MAAM,CAACE,iBAAiBC,mBAAmB,GAAGjB,SAA0B;IAExE,MAAM,EAAEkB,YAAY,EAAEC,KAAK,EAAE,GAAGJ;IAEhCjB,UAAU;QACR,IAAI,CAACqB,OAAO;YACVF,mBAAmB;YACnB;QACF;QAEA,IAAIZ,aAAae,IAAI,CAAC,CAACC,IAAMA,EAAEC,WAAW,EAAEC,SAASX,aAAa;YAChEK,mBAAmB;YACnB;QACF;QAEA,IAAI,OAAOE,UAAU,YAAYA,UAAUD,cAAc;YACvDD,mBAAmB;QACrB,OAAO;YACLA,mBAAmB;QACrB;IACF,GAAG;QAACC;QAAcC;QAAOP;KAAU;IAEnC,MAAMY,0BAA0BzB,QAAQ;QACtC,OAAO,CAAC,EAAE0B,SAAS,EAAEC,IAAI,EAAE;YACzB,MAAMC,kBAAkBpB,mBAAmBS;YAC3C,MAAMY,aAAavB,aAAawB,IAAI,CAAC,CAACR,IAAMA,EAAES,IAAI,KAAKd;YACvD,qBACE,KAACW;gBACCI,QAAQ;gBACRC,SAAS,CAACC;oBACR,IAAI,CAACR,WAAW;wBACd,MAAMS,UAAUxB,UAAU,CAAC,CAAC,EAAE,EAAEM,iBAAiB,CAAC;wBAClD,IAAI,OAAOkB,YAAY,YAAY;4BACjCA,QAAQD;wBACV,OAAO;4BACLE,QAAQC,KAAK,CAAC,wBAAwBpB;wBACxC;oBACF,OAAO;wBACLU;oBACF;gBACF;gBACAW,OAAOZ,YAAY,kBAAkBG,WAAWE,IAAI;0BAEnDL,aAAaG,WAAWU,WAAW;;QAG1C;IACF,GAAG;QAACtB;KAAgB;IAEpB,MAAMuB,oBAAoBxC,QACxB,IACEM,aAAamC,MAAM,CAAC,CAACnB,IAAMA,EAAES,IAAI,KAAKd,mBAAmB,CAACK,EAAEC,WAAW,EAAEC,SAASX,aACpF;QAACI;QAAiBJ;KAAU;IAG9B,MAAM6B,eAAe1C,QAAQ;QAC3B,OAAO,CAAC,EAAE0B,SAAS,EAAEiB,OAAO,EAAE,iBAC5B,KAACC;gBAAIC,WAAWtC,OAAOuC,IAAI;0BACxBN,kBAAkBO,GAAG,CAAC,CAACzB;oBACtB,MAAM0B,SAAS1B,EAAE2B,SAAS;oBAC1B,qBACE,KAACD;wBACCE,UAAUxB;wBAEVO,SAAS,CAACC;4BACR,IAAIZ,EAAES,IAAI,KAAK,YAAY;gCACzBb,mBAAmBI,EAAES,IAAI;4BAC3B;4BAEApB,UAAU,CAAC,CAAC,EAAE,EAAEW,EAAES,IAAI,EAAE,CAAC,CAACG;4BAC1BS;wBACF;kCAECjB,aAAaJ,EAAEiB,WAAW;uBAVtBjB,EAAES,IAAI;gBAajB;;IAGN,GAAG;QAACS;KAAkB;IAEtB,OAAO;QACLZ,iBAAiBH;QACjB0B,MAAMT;IACR;AACF,EAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAA;AAa1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAA;AAa1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAEzE,eAAO,MAAM,WAAW,GAAI,mBAAmB;IAAE,aAAa,EAAE,MAAM,CAAA;CAAE;yBA2MnD,oBAAoB;;;CA2BxC,CAAA"}
|
|
@@ -2,13 +2,21 @@ import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
|
|
|
2
2
|
import { useConfig, useField, useForm, useLocale } from '@payloadcms/ui';
|
|
3
3
|
import { jsonSchema } from 'ai';
|
|
4
4
|
import { useCompletion, experimental_useObject as useObject } from 'ai/react';
|
|
5
|
-
import { useCallback, useEffect, useMemo } from 'react';
|
|
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';
|
|
7
7
|
import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
|
|
8
8
|
import { editorSchemaValidator } from '../../../utilities/editorSchemaValidator.js';
|
|
9
9
|
import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
|
|
10
10
|
import { useHistory } from './useHistory.js';
|
|
11
11
|
export const useGenerate = ({ instructionId })=>{
|
|
12
|
+
// Create a ref to hold the current instructionId
|
|
13
|
+
const instructionIdRef = useRef(instructionId);
|
|
14
|
+
// Update the ref whenever instructionId changes
|
|
15
|
+
useEffect(()=>{
|
|
16
|
+
instructionIdRef.current = instructionId;
|
|
17
|
+
}, [
|
|
18
|
+
instructionId
|
|
19
|
+
]);
|
|
12
20
|
const { type, path: pathFromContext } = useFieldProps();
|
|
13
21
|
const editorConfigContext = useEditorConfigContext();
|
|
14
22
|
const { editor } = editorConfigContext;
|
|
@@ -72,7 +80,7 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
72
80
|
});
|
|
73
81
|
}, [
|
|
74
82
|
object,
|
|
75
|
-
|
|
83
|
+
editor
|
|
76
84
|
]);
|
|
77
85
|
const { complete, completion, isLoading: loadingCompletion, stop: completionStop } = useCompletion({
|
|
78
86
|
api: `${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE}`,
|
|
@@ -94,10 +102,11 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
94
102
|
]);
|
|
95
103
|
const streamObject = useCallback(({ action = 'Compose', params })=>{
|
|
96
104
|
const doc = getData();
|
|
105
|
+
const currentInstructionId = instructionIdRef.current;
|
|
97
106
|
const options = {
|
|
98
107
|
action,
|
|
99
108
|
actionParams: params,
|
|
100
|
-
instructionId
|
|
109
|
+
instructionId: currentInstructionId
|
|
101
110
|
};
|
|
102
111
|
submit({
|
|
103
112
|
doc,
|
|
@@ -105,16 +114,16 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
105
114
|
options
|
|
106
115
|
});
|
|
107
116
|
}, [
|
|
108
|
-
getData,
|
|
109
117
|
localFromContext?.code,
|
|
110
|
-
|
|
118
|
+
instructionIdRef
|
|
111
119
|
]);
|
|
112
120
|
const streamText = useCallback(async ({ action = 'Compose', params })=>{
|
|
113
121
|
const doc = getData();
|
|
122
|
+
const currentInstructionId = instructionIdRef.current;
|
|
114
123
|
const options = {
|
|
115
124
|
action,
|
|
116
125
|
actionParams: params,
|
|
117
|
-
instructionId
|
|
126
|
+
instructionId: currentInstructionId
|
|
118
127
|
};
|
|
119
128
|
await complete('', {
|
|
120
129
|
body: {
|
|
@@ -126,16 +135,18 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
126
135
|
}, [
|
|
127
136
|
getData,
|
|
128
137
|
localFromContext?.code,
|
|
129
|
-
|
|
138
|
+
instructionIdRef,
|
|
139
|
+
complete
|
|
130
140
|
]);
|
|
131
141
|
const generateUpload = useCallback(async ()=>{
|
|
132
142
|
const doc = getData();
|
|
143
|
+
const currentInstructionId = instructionIdRef.current;
|
|
133
144
|
return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {
|
|
134
145
|
body: JSON.stringify({
|
|
135
146
|
doc,
|
|
136
147
|
locale: localFromContext?.code,
|
|
137
148
|
options: {
|
|
138
|
-
instructionId
|
|
149
|
+
instructionId: currentInstructionId
|
|
139
150
|
}
|
|
140
151
|
}),
|
|
141
152
|
credentials: 'include',
|
|
@@ -149,6 +160,7 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
149
160
|
if (!result) throw new Error('generateUpload: Something went wrong');
|
|
150
161
|
setValue(result?.id);
|
|
151
162
|
setHistory(result?.id);
|
|
163
|
+
console.log('Image updated...', result);
|
|
152
164
|
} else {
|
|
153
165
|
const { errors = [] } = await uploadResponse.json();
|
|
154
166
|
const errStr = errors.map((error)=>error.message).join(', ');
|
|
@@ -161,7 +173,8 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
161
173
|
}, [
|
|
162
174
|
getData,
|
|
163
175
|
localFromContext?.code,
|
|
164
|
-
|
|
176
|
+
instructionIdRef,
|
|
177
|
+
setValue
|
|
165
178
|
]);
|
|
166
179
|
const generate = useCallback(async (options)=>{
|
|
167
180
|
if (type === 'richText') {
|