@ai-stack/payloadcms 3.76.0-beta.0 → 3.76.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/core/generateObject.js +1 -4
- package/dist/ai/core/generateObject.js.map +1 -1
- package/dist/ai/core/generateText.js +1 -5
- package/dist/ai/core/generateText.js.map +1 -1
- package/dist/ai/core/media/generateMedia.js +1 -4
- package/dist/ai/core/media/generateMedia.js.map +1 -1
- package/dist/ai/core/media/image/generateImage.js +4 -14
- package/dist/ai/core/media/image/generateImage.js.map +1 -1
- package/dist/ai/core/media/image/handlers/multimodal.js +21 -58
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
- package/dist/ai/core/media/image/handlers/standard.js +17 -9
- package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
- package/dist/ai/core/media/speech/generateSpeech.js +10 -11
- package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
- package/dist/ai/core/media/types.d.ts +3 -4
- package/dist/ai/core/media/types.js.map +1 -1
- package/dist/ai/core/streamObject.js +0 -3
- package/dist/ai/core/streamObject.js.map +1 -1
- package/dist/ai/core/streamText.js +1 -4
- package/dist/ai/core/streamText.js.map +1 -1
- package/dist/ai/core/types.d.ts +2 -2
- package/dist/ai/core/types.js.map +1 -1
- package/dist/ai/providers/blocks/anthropic.js +0 -42
- package/dist/ai/providers/blocks/anthropic.js.map +1 -1
- package/dist/ai/providers/blocks/elevenlabs.js +1 -106
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
- package/dist/ai/providers/blocks/fal.js +0 -118
- package/dist/ai/providers/blocks/fal.js.map +1 -1
- package/dist/ai/providers/blocks/google.js +2 -236
- package/dist/ai/providers/blocks/google.js.map +1 -1
- package/dist/ai/providers/blocks/openai-compatible.js +0 -144
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
- package/dist/ai/providers/blocks/openai.js +0 -200
- package/dist/ai/providers/blocks/openai.js.map +1 -1
- package/dist/ai/providers/blocks/xai.js +0 -53
- package/dist/ai/providers/blocks/xai.js.map +1 -1
- package/dist/ai/providers/index.d.ts +1 -1
- package/dist/ai/providers/index.js +0 -2
- package/dist/ai/providers/index.js.map +1 -1
- package/dist/ai/providers/registry.d.ts +24 -28
- package/dist/ai/providers/registry.js +186 -140
- package/dist/ai/providers/registry.js.map +1 -1
- package/dist/ai/providers/types.d.ts +12 -33
- package/dist/ai/providers/types.js +0 -1
- package/dist/ai/providers/types.js.map +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
- package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
- package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
- package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
- package/dist/ai/utilities/isObjectSchema.js.map +1 -0
- package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
- package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
- package/dist/ai/utilities/prompts.js.map +1 -0
- package/dist/ai/utilities/systemGenerate.js.map +1 -0
- package/dist/collections/AIJobs.js +3 -12
- package/dist/collections/AIJobs.js.map +1 -1
- package/dist/collections/AIProviders.d.ts +2 -0
- package/dist/collections/{AISettings.js → AIProviders.js} +54 -26
- package/dist/collections/AIProviders.js.map +1 -0
- package/dist/collections/Instructions.js +93 -57
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/collections/shared.d.ts +30 -0
- package/dist/collections/shared.js +15 -0
- package/dist/collections/shared.js.map +1 -0
- package/dist/defaults.js +1 -1
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/fetchFields.js +15 -7
- package/dist/endpoints/fetchFields.js.map +1 -1
- package/dist/endpoints/fetchVoices.js +2 -2
- package/dist/endpoints/fetchVoices.js.map +1 -1
- package/dist/endpoints/generate.d.ts +7 -0
- package/dist/endpoints/generate.js +268 -0
- package/dist/endpoints/generate.js.map +1 -0
- package/dist/endpoints/index.js +9 -604
- package/dist/endpoints/index.js.map +1 -1
- package/dist/endpoints/promptMentions.d.ts +2 -0
- package/dist/endpoints/promptMentions.js +166 -0
- package/dist/endpoints/promptMentions.js.map +1 -0
- package/dist/endpoints/upload.d.ts +7 -0
- package/dist/endpoints/upload.js +294 -0
- package/dist/endpoints/upload.js.map +1 -0
- package/dist/endpoints/videogenWebhook.d.ts +7 -0
- package/dist/endpoints/videogenWebhook.js +132 -0
- package/dist/endpoints/videogenWebhook.js.map +1 -0
- package/dist/exports/client.d.ts +3 -2
- package/dist/exports/client.js +3 -2
- package/dist/exports/client.js.map +1 -1
- package/dist/exports/fields.d.ts +2 -1
- package/dist/exports/fields.js +2 -1
- package/dist/exports/fields.js.map +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
- package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
- package/dist/fields/ComposeField/ComposeField.js +18 -8
- package/dist/fields/ComposeField/ComposeField.js.map +1 -1
- package/dist/fields/ComposeField/ComposeField.jsx +12 -7
- package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
- package/dist/fields/PromptEditorField/feature.client.js +173 -0
- package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
- package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
- package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
- package/dist/fields/PromptEditorField/feature.server.js +30 -0
- package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
- package/dist/fields/PromptField.d.ts +4 -0
- package/dist/fields/PromptField.js +18 -0
- package/dist/fields/PromptField.js.map +1 -0
- package/dist/fields/SelectField/SelectField.js +0 -1
- package/dist/fields/SelectField/SelectField.js.map +1 -1
- package/dist/fields/SelectField/SelectField.jsx +0 -1
- package/dist/index.d.ts +4 -3
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/dist/libraries/handlebars/helpers.js +2 -2
- package/dist/libraries/handlebars/helpers.js.map +1 -1
- package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
- package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
- package/dist/payload-ai.d.ts +5 -19
- package/dist/plugin.js +19 -22
- package/dist/plugin.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.js +10 -19
- package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.jsx +7 -17
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +4 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
- package/dist/providers/InstructionsProvider/useInstructions.js +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/translations/de.json +47 -0
- package/dist/translations/en.json +45 -2
- package/dist/translations/es.json +45 -2
- package/dist/translations/fa.json +45 -2
- package/dist/translations/fr.json +46 -3
- package/dist/translations/hi.json +47 -0
- package/dist/translations/index.d.ts +88 -26
- package/dist/translations/index.js +18 -32
- package/dist/translations/index.js.map +1 -1
- package/dist/translations/ja.json +47 -0
- package/dist/translations/nb.json +47 -0
- package/dist/translations/nl.json +47 -0
- package/dist/translations/pl.json +45 -2
- package/dist/translations/pt.json +47 -0
- package/dist/translations/ru.json +45 -2
- package/dist/translations/th.json +47 -0
- package/dist/translations/translation-schema.json +184 -11
- package/dist/translations/uk.json +45 -2
- package/dist/translations/zh.json +47 -0
- package/dist/types.d.ts +57 -31
- package/dist/types.js.map +1 -1
- package/dist/ui/Compose/Compose.js +42 -79
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +32 -86
- package/dist/ui/Compose/ComposePlaceholder.js +1 -1
- package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
- package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
- package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
- package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
- package/dist/ui/Compose/hooks/menu/Item.js +7 -3
- package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
- package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts +5 -0
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js +48 -5
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +44 -6
- package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
- package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/menu.module.scss +4 -1
- package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
- package/dist/ui/Compose/hooks/menu/types.js +3 -0
- package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
- package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
- package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
- package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
- package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
- package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js +34 -0
- package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerate.js +37 -12
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerateUpload.js +67 -19
- package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
- package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
- package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
- package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
- package/dist/ui/ConfigDashboard/index.d.ts +2 -0
- package/dist/ui/ConfigDashboard/index.js +159 -0
- package/dist/ui/ConfigDashboard/index.js.map +1 -0
- package/dist/ui/ConfigDashboard/index.jsx +122 -0
- package/dist/ui/DynamicModelSelect/index.js +6 -27
- package/dist/ui/DynamicModelSelect/index.js.map +1 -1
- package/dist/ui/DynamicModelSelect/index.jsx +6 -29
- package/dist/ui/DynamicProviderSelect/index.js +6 -27
- package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
- package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
- package/dist/ui/DynamicVoiceSelect/index.js +34 -83
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
- package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
- package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
- package/dist/ui/GlobalProviderOptions/index.js +118 -0
- package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
- package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
- package/dist/ui/Icons/Icons.js +1 -1
- package/dist/ui/Icons/Icons.js.map +1 -1
- package/dist/ui/Icons/Icons.jsx +1 -1
- package/dist/ui/Icons/LottieAnimation.js +1 -1
- package/dist/ui/Icons/LottieAnimation.js.map +1 -1
- package/dist/ui/Icons/LottieAnimation.jsx +1 -1
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
- package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
- package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
- package/dist/ui/InstructionProviderOptions/index.js +157 -0
- package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
- package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
- package/dist/ui/VoicesFetcher/index.js.map +1 -1
- package/dist/ui/hooks/useAISettings.d.ts +26 -0
- package/dist/ui/hooks/useAISettings.js +73 -0
- package/dist/ui/hooks/useAISettings.js.map +1 -0
- package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
- package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
- package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
- package/dist/ui/shared/handleSelectChange.d.ts +5 -0
- package/dist/ui/shared/handleSelectChange.js +12 -0
- package/dist/ui/shared/handleSelectChange.js.map +1 -0
- package/dist/ui/shared/types.d.ts +11 -0
- package/dist/ui/shared/types.js +5 -0
- package/dist/ui/shared/types.js.map +1 -0
- package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
- package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
- package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
- package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
- package/dist/utilities/buildPromptUtils.js.map +1 -0
- package/dist/utilities/buildSmartPrompt.js +3 -3
- package/dist/utilities/buildSmartPrompt.js.map +1 -1
- package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
- package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
- package/dist/utilities/fields/getFieldInfo.js.map +1 -0
- package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
- package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
- package/dist/utilities/images/extractImageData.js.map +1 -0
- package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
- package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
- package/dist/utilities/images/fetchImages.js +49 -0
- package/dist/utilities/images/fetchImages.js.map +1 -0
- package/dist/utilities/images/resolveImageReferences.js +183 -0
- package/dist/utilities/images/resolveImageReferences.js.map +1 -0
- package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
- package/dist/utilities/init/autoSetupProviders.js +216 -0
- package/dist/utilities/init/autoSetupProviders.js.map +1 -0
- package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
- package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
- package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
- package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
- package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
- package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
- package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
- package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
- package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
- package/dist/utilities/sanitizeLog.d.ts +1 -0
- package/dist/utilities/sanitizeLog.js +39 -0
- package/dist/utilities/sanitizeLog.js.map +1 -0
- package/dist/utilities/seedProperties.js +37 -22
- package/dist/utilities/seedProperties.js.map +1 -1
- package/package.json +5 -2
- package/dist/ai/analyse.d.ts +0 -1
- package/dist/ai/analyse.js +0 -3
- package/dist/ai/analyse.js.map +0 -1
- package/dist/ai/index.d.ts +0 -11
- package/dist/ai/index.js +0 -25
- package/dist/ai/index.js.map +0 -1
- package/dist/ai/prompts.js.map +0 -1
- package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
- package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
- package/dist/ai/utils/isObjectSchema.js.map +0 -1
- package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
- package/dist/ai/utils/systemGenerate.js.map +0 -1
- package/dist/collections/AISettings.d.ts +0 -2
- package/dist/collections/AISettings.js.map +0 -1
- package/dist/endpoints/buildPromptUtils.js.map +0 -1
- package/dist/endpoints/chat.d.ts +0 -4
- package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
- package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
- package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
- package/dist/ui/AIConfigDashboard/index.js +0 -222
- package/dist/ui/AIConfigDashboard/index.js.map +0 -1
- package/dist/ui/AIConfigDashboard/index.jsx +0 -170
- package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
- package/dist/ui/ProviderOptionsEditor/index.js +0 -291
- package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
- package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
- package/dist/utilities/editorSchemaValidator.js.map +0 -1
- package/dist/utilities/extractImageData.js.map +0 -1
- package/dist/utilities/extractPromptAttachments.js.map +0 -1
- package/dist/utilities/fetchImages.js +0 -38
- package/dist/utilities/fetchImages.js.map +0 -1
- package/dist/utilities/fieldToJsonSchema.js.map +0 -1
- package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
- package/dist/utilities/getFieldInfo.js.map +0 -1
- package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
- package/dist/utilities/getProviderOptionsFields.js +0 -80
- package/dist/utilities/getProviderOptionsFields.js.map +0 -1
- package/dist/utilities/isPluginActivated.d.ts +0 -2
- package/dist/utilities/isPluginActivated.js +0 -5
- package/dist/utilities/isPluginActivated.js.map +0 -1
- package/dist/utilities/lexicalToHTML.js.map +0 -1
- package/dist/utilities/resolveImageReferences.js +0 -167
- package/dist/utilities/resolveImageReferences.js.map +0 -1
- package/dist/utilities/schemaConverter.d.ts +0 -3
- package/dist/utilities/schemaConverter.js +0 -93
- package/dist/utilities/schemaConverter.js.map +0 -1
- package/dist/utilities/setSafeLexicalState.js.map +0 -1
- package/dist/utilities/updateFieldsConfig.js.map +0 -1
- /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
- /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
- /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
- /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +0 -0
- /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
- /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
- /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
- /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
- /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
- /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
- /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
- /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
- /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
- /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
- /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
- /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
- /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
- /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
- /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
- /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
- /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
- /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
- /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
- /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
- /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
- /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
- /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
|
@@ -5,7 +5,9 @@ import { jsonSchema } from 'ai';
|
|
|
5
5
|
import { useCallback, useEffect, useRef } from 'react';
|
|
6
6
|
import { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js';
|
|
7
7
|
import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
|
|
8
|
-
import {
|
|
8
|
+
import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
|
|
9
|
+
import { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js';
|
|
10
|
+
import { mergeGeneratedValue } from './mergeGeneratedValue.js';
|
|
9
11
|
import { useGenerateUpload } from './useGenerateUpload.js';
|
|
10
12
|
import { useHistory } from './useHistory.js';
|
|
11
13
|
import { useStreamingUpdate } from './useStreamingUpdate.js';
|
|
@@ -18,15 +20,30 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
18
20
|
}, [
|
|
19
21
|
instructionId
|
|
20
22
|
]);
|
|
21
|
-
const { field, path: pathFromContext } = useFieldProps();
|
|
23
|
+
const { field, path: pathFromContext, schemaPath } = useFieldProps();
|
|
24
|
+
const { appendGenerated } = useInstructions({
|
|
25
|
+
schemaPath
|
|
26
|
+
});
|
|
22
27
|
const editorConfigContext = useEditorConfigContext();
|
|
23
|
-
const { setValue } = useField({
|
|
28
|
+
const { setValue, value: currentFieldValue } = useField({
|
|
24
29
|
path: pathFromContext ?? ''
|
|
25
30
|
});
|
|
31
|
+
const appendGeneratedRef = useRef(!!appendGenerated);
|
|
32
|
+
const currentFieldValueRef = useRef(currentFieldValue);
|
|
26
33
|
const { set: setHistory } = useHistory();
|
|
27
34
|
const { getData } = useForm();
|
|
28
35
|
const { id: documentId } = useDocumentInfo();
|
|
29
|
-
const
|
|
36
|
+
const locale = useLocale();
|
|
37
|
+
useEffect(()=>{
|
|
38
|
+
appendGeneratedRef.current = !!appendGenerated;
|
|
39
|
+
}, [
|
|
40
|
+
appendGenerated
|
|
41
|
+
]);
|
|
42
|
+
useEffect(()=>{
|
|
43
|
+
currentFieldValueRef.current = currentFieldValue;
|
|
44
|
+
}, [
|
|
45
|
+
currentFieldValue
|
|
46
|
+
]);
|
|
30
47
|
const { isLoading: loadingObject, object, stop: objectStop, submit } = useObject({
|
|
31
48
|
api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
|
|
32
49
|
onError: (error)=>{
|
|
@@ -38,12 +55,21 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
38
55
|
if (field.type === 'richText') {
|
|
39
56
|
setHistory(result.object);
|
|
40
57
|
setSafeLexicalState(result.object, editor);
|
|
41
|
-
} else if ('name' in field && result.object[field.name]) {
|
|
42
|
-
|
|
43
|
-
|
|
58
|
+
} else if ('name' in field && result.object[field.name] !== undefined) {
|
|
59
|
+
const merged = mergeGeneratedValue({
|
|
60
|
+
appendGenerated: appendGeneratedRef.current,
|
|
61
|
+
currentValue: currentFieldValueRef.current,
|
|
62
|
+
generatedValue: result.object[field.name],
|
|
63
|
+
hasMany: field.hasMany === true,
|
|
64
|
+
max: typeof field.max === 'number' ? field.max : undefined,
|
|
65
|
+
maxRows: typeof field.maxRows === 'number' ? field.maxRows : undefined
|
|
66
|
+
});
|
|
67
|
+
if (merged.truncated) {
|
|
68
|
+
toast.info('Appended values were truncated to this field maximum.');
|
|
69
|
+
}
|
|
70
|
+
setHistory(merged.value);
|
|
71
|
+
setValue(merged.value);
|
|
44
72
|
}
|
|
45
|
-
} else {
|
|
46
|
-
console.log('onFinish: result, field ', result, field);
|
|
47
73
|
}
|
|
48
74
|
},
|
|
49
75
|
schema: jsonSchema({
|
|
@@ -77,11 +103,11 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
77
103
|
...doc,
|
|
78
104
|
id: documentId
|
|
79
105
|
},
|
|
80
|
-
locale:
|
|
106
|
+
locale: locale?.code,
|
|
81
107
|
options
|
|
82
108
|
});
|
|
83
109
|
}, [
|
|
84
|
-
|
|
110
|
+
locale?.code,
|
|
85
111
|
instructionIdRef,
|
|
86
112
|
documentId,
|
|
87
113
|
getData,
|
|
@@ -102,7 +128,6 @@ export const useGenerate = ({ instructionId })=>{
|
|
|
102
128
|
field
|
|
103
129
|
]);
|
|
104
130
|
const stop = useCallback(()=>{
|
|
105
|
-
console.log('Stopping...');
|
|
106
131
|
objectStop();
|
|
107
132
|
}, [
|
|
108
133
|
objectStop
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ActionMenuItems } from '../../../types.js'\n\nimport { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useGenerateUpload } from './useGenerateUpload.js'\nimport { useHistory } from './useHistory.js'\nimport { useStreamingUpdate } from './useStreamingUpdate.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 { field, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n const { setValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n const { set: setHistory } = useHistory()\n const { getData } = useForm()\n const { id: documentId } = useDocumentInfo()\n const
|
|
1
|
+
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ActionMenuItems } from '../../../types.js'\n\nimport { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js'\nimport { mergeGeneratedValue } from './mergeGeneratedValue.js'\nimport { useGenerateUpload } from './useGenerateUpload.js'\nimport { useHistory } from './useHistory.js'\nimport { useStreamingUpdate } from './useStreamingUpdate.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 { field, path: pathFromContext, schemaPath } = useFieldProps()\n const { appendGenerated } = useInstructions({ schemaPath })\n const editorConfigContext = useEditorConfigContext()\n const { setValue, value: currentFieldValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n const appendGeneratedRef = useRef(!!appendGenerated)\n const currentFieldValueRef = useRef(currentFieldValue)\n const { set: setHistory } = useHistory()\n const { getData } = useForm()\n const { id: documentId } = useDocumentInfo()\n const locale = useLocale()\n\n useEffect(() => {\n appendGeneratedRef.current = !!appendGenerated\n }, [appendGenerated])\n\n useEffect(() => {\n currentFieldValueRef.current = currentFieldValue\n }, [currentFieldValue])\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 && field) {\n if (field.type === 'richText') {\n setHistory(result.object)\n setSafeLexicalState(result.object, editor)\n } else if ('name' in field && result.object[field.name] !== undefined) {\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue: result.object[field.name],\n hasMany: (field as any).hasMany === true,\n max: typeof (field as any).max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any).maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setHistory(merged.value)\n setValue(merged.value)\n }\n }\n },\n schema: jsonSchema({\n type: 'object',\n additionalProperties: true,\n properties: {},\n }) as any,\n })\n\n const { editor } = editorConfigContext\n\n // Hook: Handle high-frequency streaming updates\n useStreamingUpdate({\n editor,\n isLoading: loadingObject,\n object,\n })\n\n // Hook 2: Handle Upload generation and polling\n const { generateUpload, isJobActive, jobProgress, jobStatus } = useGenerateUpload({\n instructionIdRef,\n })\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: locale?.code,\n options,\n })\n },\n [locale?.code, instructionIdRef, documentId, getData, submit, editor],\n )\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if ((field as any)?.type === 'upload') {\n return generateUpload()\n }\n // All supported types use structured object generation when schema is provided server-side\n return streamObject(options ?? { action: 'Compose' })\n },\n [generateUpload, streamObject, field],\n )\n\n const stop = useCallback(() => {\n objectStop()\n }, [objectStop])\n\n return {\n generate,\n isJobActive,\n isLoading: loadingObject,\n jobProgress,\n jobStatus,\n stop,\n }\n}\n"],"names":["experimental_useObject","useObject","useEditorConfigContext","toast","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useRef","PLUGIN_API_ENDPOINT_GENERATE","useFieldProps","useInstructions","setSafeLexicalState","mergeGeneratedValue","useGenerateUpload","useHistory","useStreamingUpdate","useGenerate","instructionId","instructionIdRef","current","field","path","pathFromContext","schemaPath","appendGenerated","editorConfigContext","setValue","value","currentFieldValue","appendGeneratedRef","currentFieldValueRef","set","setHistory","getData","id","documentId","locale","isLoading","loadingObject","object","stop","objectStop","submit","api","onError","error","message","console","onFinish","result","type","editor","name","undefined","merged","currentValue","generatedValue","hasMany","max","maxRows","truncated","info","schema","additionalProperties","properties","generateUpload","isJobActive","jobProgress","jobStatus","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","code","generate"],"mappings":"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"}
|
|
@@ -1,23 +1,47 @@
|
|
|
1
1
|
import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui';
|
|
2
|
-
import { useCallback, useState } from 'react';
|
|
2
|
+
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
3
|
import { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD } from '../../../defaults.js';
|
|
4
4
|
import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
|
|
5
|
+
import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
|
|
6
|
+
import { mergeGeneratedValue } from './mergeGeneratedValue.js';
|
|
5
7
|
import { useHistory } from './useHistory.js';
|
|
6
8
|
export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
7
9
|
const { config } = useConfig();
|
|
8
10
|
const { routes: { api }, serverURL } = config;
|
|
9
11
|
const { id: documentId, collectionSlug } = useDocumentInfo();
|
|
10
|
-
const
|
|
12
|
+
const locale = useLocale();
|
|
11
13
|
const { getData } = useForm();
|
|
12
14
|
const { set: setHistory } = useHistory();
|
|
13
|
-
const { field, path:
|
|
14
|
-
const {
|
|
15
|
-
|
|
15
|
+
const { field, path: fieldPath, schemaPath } = useFieldProps();
|
|
16
|
+
const { appendGenerated } = useInstructions({
|
|
17
|
+
schemaPath
|
|
16
18
|
});
|
|
19
|
+
const { setValue, value: currentFieldValue } = useField({
|
|
20
|
+
path: fieldPath ?? ''
|
|
21
|
+
});
|
|
22
|
+
const appendGeneratedRef = useRef(!!appendGenerated);
|
|
23
|
+
const currentFieldValueRef = useRef(currentFieldValue);
|
|
17
24
|
// Async job UI state
|
|
18
25
|
const [jobStatus, setJobStatus] = useState(undefined);
|
|
19
26
|
const [jobProgress, setJobProgress] = useState(0);
|
|
20
27
|
const [isJobActive, setIsJobActive] = useState(false);
|
|
28
|
+
// Track whether the component is still mounted to prevent orphaned polling
|
|
29
|
+
const cancelledRef = useRef(false);
|
|
30
|
+
useEffect(()=>{
|
|
31
|
+
return ()=>{
|
|
32
|
+
cancelledRef.current = true;
|
|
33
|
+
};
|
|
34
|
+
}, []);
|
|
35
|
+
useEffect(()=>{
|
|
36
|
+
appendGeneratedRef.current = !!appendGenerated;
|
|
37
|
+
}, [
|
|
38
|
+
appendGenerated
|
|
39
|
+
]);
|
|
40
|
+
useEffect(()=>{
|
|
41
|
+
currentFieldValueRef.current = currentFieldValue;
|
|
42
|
+
}, [
|
|
43
|
+
currentFieldValue
|
|
44
|
+
]);
|
|
21
45
|
const generateUpload = useCallback(async ()=>{
|
|
22
46
|
const doc = getData();
|
|
23
47
|
const currentInstructionId = instructionIdRef.current;
|
|
@@ -26,7 +50,7 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
26
50
|
collectionSlug: collectionSlug ?? '',
|
|
27
51
|
doc,
|
|
28
52
|
documentId,
|
|
29
|
-
locale:
|
|
53
|
+
locale: locale?.code,
|
|
30
54
|
options: {
|
|
31
55
|
instructionId: currentInstructionId
|
|
32
56
|
}
|
|
@@ -41,8 +65,21 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
41
65
|
const json = await uploadResponse.json();
|
|
42
66
|
const { job, result } = json || {};
|
|
43
67
|
if (result) {
|
|
44
|
-
|
|
45
|
-
|
|
68
|
+
const hasMany = field?.hasMany === true;
|
|
69
|
+
const generatedValue = Array.isArray(result) ? result.map((r)=>r.id) : result?.id;
|
|
70
|
+
const merged = mergeGeneratedValue({
|
|
71
|
+
appendGenerated: appendGeneratedRef.current,
|
|
72
|
+
currentValue: currentFieldValueRef.current,
|
|
73
|
+
generatedValue,
|
|
74
|
+
hasMany,
|
|
75
|
+
max: typeof field?.max === 'number' ? field.max : undefined,
|
|
76
|
+
maxRows: typeof field?.maxRows === 'number' ? field.maxRows : undefined
|
|
77
|
+
});
|
|
78
|
+
if (merged.truncated) {
|
|
79
|
+
toast.info('Appended values were truncated to this field maximum.');
|
|
80
|
+
}
|
|
81
|
+
setValue(merged.value);
|
|
82
|
+
setHistory(merged.value);
|
|
46
83
|
// Show toast to prompt user to save
|
|
47
84
|
toast.success('Image generated successfully! Click Save to see the preview.');
|
|
48
85
|
return uploadResponse;
|
|
@@ -50,15 +87,10 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
50
87
|
// Async job: poll AI Jobs collection for status/progress/result_id
|
|
51
88
|
if (job && job.id) {
|
|
52
89
|
setIsJobActive(true);
|
|
53
|
-
const cancelled = false;
|
|
54
90
|
let attempts = 0;
|
|
55
91
|
const maxAttempts = 600 // up to ~10 minutes @ 1s
|
|
56
92
|
;
|
|
57
|
-
// Basic in-hook state via closure variables; UI will re-render off fetches below
|
|
58
93
|
const poll = async ()=>{
|
|
59
|
-
if (cancelled) {
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
94
|
try {
|
|
63
95
|
const res = await fetch(`${serverURL}${api}/${PLUGIN_AI_JOBS_TABLE}/${job.id}`, {
|
|
64
96
|
credentials: 'include'
|
|
@@ -70,9 +102,10 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
70
102
|
setJobProgress(progress ?? 0);
|
|
71
103
|
// When result present, set field and finish
|
|
72
104
|
if (status === 'completed' && result_id) {
|
|
105
|
+
const hasMany = field?.hasMany === true;
|
|
73
106
|
let valueToSet = result_id;
|
|
74
107
|
// Attempt to fetch full document for immediate preview
|
|
75
|
-
if (field && 'relationTo' in field && typeof field.relationTo === 'string') {
|
|
108
|
+
if (!hasMany && field && 'relationTo' in field && typeof field.relationTo === 'string') {
|
|
76
109
|
let attempts = 0;
|
|
77
110
|
const maxAttempts = 3;
|
|
78
111
|
while(attempts < maxAttempts){
|
|
@@ -97,8 +130,22 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
97
130
|
}
|
|
98
131
|
}
|
|
99
132
|
}
|
|
100
|
-
|
|
101
|
-
|
|
133
|
+
const generatedValue = hasMany ? [
|
|
134
|
+
result_id
|
|
135
|
+
] : valueToSet;
|
|
136
|
+
const merged = mergeGeneratedValue({
|
|
137
|
+
appendGenerated: appendGeneratedRef.current,
|
|
138
|
+
currentValue: currentFieldValueRef.current,
|
|
139
|
+
generatedValue,
|
|
140
|
+
hasMany,
|
|
141
|
+
max: typeof field?.max === 'number' ? field.max : undefined,
|
|
142
|
+
maxRows: typeof field?.maxRows === 'number' ? field.maxRows : undefined
|
|
143
|
+
});
|
|
144
|
+
if (merged.truncated) {
|
|
145
|
+
toast.info('Appended values were truncated to this field maximum.');
|
|
146
|
+
}
|
|
147
|
+
setValue(merged.value);
|
|
148
|
+
setHistory(merged.value);
|
|
102
149
|
setIsJobActive(false);
|
|
103
150
|
return;
|
|
104
151
|
}
|
|
@@ -111,7 +158,7 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
111
158
|
// silent retry
|
|
112
159
|
}
|
|
113
160
|
attempts += 1;
|
|
114
|
-
if (
|
|
161
|
+
if (attempts < maxAttempts && !cancelledRef.current) {
|
|
115
162
|
setTimeout(poll, 1000);
|
|
116
163
|
}
|
|
117
164
|
};
|
|
@@ -130,9 +177,10 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
|
|
|
130
177
|
});
|
|
131
178
|
}, [
|
|
132
179
|
getData,
|
|
133
|
-
|
|
180
|
+
locale?.code,
|
|
134
181
|
instructionIdRef,
|
|
135
|
-
|
|
182
|
+
setValue,
|
|
183
|
+
field,
|
|
136
184
|
documentId,
|
|
137
185
|
collectionSlug,
|
|
138
186
|
serverURL,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerateUpload.ts"],"sourcesContent":["import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { type RefObject, useCallback, useState } from 'react'\n\nimport type { GenerateTextarea } from '../../../types.js'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useHistory } from './useHistory.js'\n\ntype UseGenerateUploadParams = {\n instructionIdRef: RefObject<string>\n}\n\nexport const useGenerateUpload = ({ instructionIdRef }: UseGenerateUploadParams) => {\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n const { id: documentId, collectionSlug } = useDocumentInfo()\n const localFromContext = useLocale()\n const { getData } = useForm()\n const { set: setHistory } = useHistory()\n\n const { field, path: pathFromContext } = useFieldProps()\n const { setValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n\n // Async job UI state\n const [jobStatus, setJobStatus] = useState<string | undefined>(undefined)\n const [jobProgress, setJobProgress] = useState<number>(0)\n const [isJobActive, setIsJobActive] = useState<boolean>(false)\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 json = await uploadResponse.json()\n const { job, result } = json || {}\n if (result) {\n setValue(result?.id)\n setHistory(result?.id)\n\n // Show toast to prompt user to save\n toast.success('Image generated successfully! Click Save to see the preview.')\n\n return uploadResponse\n }\n\n // Async job: poll AI Jobs collection for status/progress/result_id\n if (job && job.id) {\n setIsJobActive(true)\n const cancelled = false\n let attempts = 0\n const maxAttempts = 600 // up to ~10 minutes @ 1s\n\n // Basic in-hook state via closure variables; UI will re-render off fetches below\n const poll = async (): Promise<void> => {\n if (cancelled) {\n return\n }\n try {\n const res = await fetch(`${serverURL}${api}/${PLUGIN_AI_JOBS_TABLE}/${job.id}`, {\n credentials: 'include',\n })\n if (res.ok) {\n const jobDoc = await res.json()\n const { progress, result_id, status } = jobDoc || {}\n setJobStatus(status)\n setJobProgress(progress ?? 0)\n // When result present, set field and finish\n if (status === 'completed' && result_id) {\n let valueToSet = result_id\n\n // Attempt to fetch full document for immediate preview\n if (field && 'relationTo' in field && typeof field.relationTo === 'string') {\n let attempts = 0\n const maxAttempts = 3\n while (attempts < maxAttempts) {\n try {\n const docRes = await fetch(\n `${serverURL}${api}/${field.relationTo}/${result_id}`,\n {\n credentials: 'include',\n },\n )\n if (docRes.ok) {\n const doc = await docRes.json()\n // Verify we have a URL for preview\n if (doc && doc.url) {\n valueToSet = doc\n break\n }\n }\n } catch (e) {\n console.error('Failed to fetch generated document for preview:', e)\n }\n attempts++\n if (attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n }\n }\n }\n\n setValue(valueToSet)\n setHistory(result_id)\n setIsJobActive(false)\n return\n }\n if (status === 'failed') {\n setIsJobActive(false)\n throw new Error('Video generation failed')\n }\n }\n } catch (_) {\n // silent retry\n }\n\n attempts += 1\n if (!cancelled && attempts < maxAttempts) {\n setTimeout(poll, 1000)\n }\n }\n setTimeout(poll, 1000)\n return uploadResponse\n }\n\n throw new Error('generateUpload: Unexpected response')\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 })\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 }, [\n getData,\n localFromContext?.code,\n instructionIdRef,\n // setValue,\n documentId,\n collectionSlug,\n serverURL,\n api,\n setHistory,\n ])\n\n return {\n generateUpload,\n isJobActive,\n jobProgress,\n jobStatus,\n }\n}\n"],"names":["toast","useConfig","useDocumentInfo","useField","useForm","useLocale","useCallback","useState","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","useFieldProps","useHistory","useGenerateUpload","instructionIdRef","config","routes","api","serverURL","id","documentId","collectionSlug","localFromContext","getData","set","setHistory","field","path","pathFromContext","setValue","jobStatus","setJobStatus","undefined","jobProgress","setJobProgress","isJobActive","setIsJobActive","generateUpload","doc","currentInstructionId","current","fetch","body","JSON","stringify","locale","code","options","instructionId","credentials","headers","method","then","uploadResponse","ok","json","job","result","success","cancelled","attempts","maxAttempts","poll","res","jobDoc","progress","result_id","status","valueToSet","relationTo","docRes","url","e","console","error","Promise","resolve","setTimeout","Error","_","errors","errStr","map","message","join","catch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerateUpload.ts"],"sourcesContent":["import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { GenerateTextarea } from '../../../types.js'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js'\nimport { mergeGeneratedValue } from './mergeGeneratedValue.js'\nimport { useHistory } from './useHistory.js'\n\ntype UseGenerateUploadParams = {\n instructionIdRef: RefObject<string>\n}\n\nexport const useGenerateUpload = ({ instructionIdRef }: UseGenerateUploadParams) => {\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n const { id: documentId, collectionSlug } = useDocumentInfo()\n const locale = useLocale()\n const { getData } = useForm()\n const { set: setHistory } = useHistory()\n\n const { field, path: fieldPath, schemaPath } = useFieldProps()\n const { appendGenerated } = useInstructions({ schemaPath })\n const { setValue, value: currentFieldValue } = useField<any>({\n path: fieldPath ?? '',\n })\n const appendGeneratedRef = useRef(!!appendGenerated)\n const currentFieldValueRef = useRef(currentFieldValue)\n\n // Async job UI state\n const [jobStatus, setJobStatus] = useState<string | undefined>(undefined)\n const [jobProgress, setJobProgress] = useState<number>(0)\n const [isJobActive, setIsJobActive] = useState<boolean>(false)\n\n // Track whether the component is still mounted to prevent orphaned polling\n const cancelledRef = useRef(false)\n useEffect(() => {\n return () => {\n cancelledRef.current = true\n }\n }, [])\n\n useEffect(() => {\n appendGeneratedRef.current = !!appendGenerated\n }, [appendGenerated])\n\n useEffect(() => {\n currentFieldValueRef.current = currentFieldValue\n }, [currentFieldValue])\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: locale?.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 json = await uploadResponse.json()\n const { job, result } = json || {}\n if (result) {\n const hasMany = (field as any)?.hasMany === true\n const generatedValue = Array.isArray(result) ? result.map((r: any) => r.id) : result?.id\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue,\n hasMany,\n max: typeof (field as any)?.max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any)?.maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setValue(merged.value)\n setHistory(merged.value)\n\n // Show toast to prompt user to save\n toast.success('Image generated successfully! Click Save to see the preview.')\n\n return uploadResponse\n }\n\n // Async job: poll AI Jobs collection for status/progress/result_id\n if (job && job.id) {\n setIsJobActive(true)\n let attempts = 0\n const maxAttempts = 600 // up to ~10 minutes @ 1s\n\n const poll = async (): Promise<void> => {\n try {\n const res = await fetch(`${serverURL}${api}/${PLUGIN_AI_JOBS_TABLE}/${job.id}`, {\n credentials: 'include',\n })\n if (res.ok) {\n const jobDoc = await res.json()\n const { progress, result_id, status } = jobDoc || {}\n setJobStatus(status)\n setJobProgress(progress ?? 0)\n // When result present, set field and finish\n if (status === 'completed' && result_id) {\n const hasMany = (field as any)?.hasMany === true\n let valueToSet = result_id\n\n // Attempt to fetch full document for immediate preview\n if (\n !hasMany &&\n field &&\n 'relationTo' in field &&\n typeof field.relationTo === 'string'\n ) {\n let attempts = 0\n const maxAttempts = 3\n while (attempts < maxAttempts) {\n try {\n const docRes = await fetch(\n `${serverURL}${api}/${field.relationTo}/${result_id}`,\n {\n credentials: 'include',\n },\n )\n if (docRes.ok) {\n const doc = await docRes.json()\n // Verify we have a URL for preview\n if (doc && doc.url) {\n valueToSet = doc\n break\n }\n }\n } catch (e) {\n console.error('Failed to fetch generated document for preview:', e)\n }\n attempts++\n if (attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n }\n }\n }\n\n const generatedValue = hasMany ? [result_id] : valueToSet\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue,\n hasMany,\n max: typeof (field as any)?.max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any)?.maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setValue(merged.value)\n setHistory(merged.value)\n setIsJobActive(false)\n return\n }\n if (status === 'failed') {\n setIsJobActive(false)\n throw new Error('Video generation failed')\n }\n }\n } catch (_) {\n // silent retry\n }\n\n attempts += 1\n if (attempts < maxAttempts && !cancelledRef.current) {\n setTimeout(poll, 1000)\n }\n }\n setTimeout(poll, 1000)\n return uploadResponse\n }\n\n throw new Error('generateUpload: Unexpected response')\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 })\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 }, [\n getData,\n locale?.code,\n instructionIdRef,\n setValue,\n field,\n documentId,\n collectionSlug,\n serverURL,\n api,\n setHistory,\n ])\n\n return {\n generateUpload,\n isJobActive,\n jobProgress,\n jobStatus,\n }\n}\n"],"names":["toast","useConfig","useDocumentInfo","useField","useForm","useLocale","useCallback","useEffect","useRef","useState","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","useFieldProps","useInstructions","mergeGeneratedValue","useHistory","useGenerateUpload","instructionIdRef","config","routes","api","serverURL","id","documentId","collectionSlug","locale","getData","set","setHistory","field","path","fieldPath","schemaPath","appendGenerated","setValue","value","currentFieldValue","appendGeneratedRef","currentFieldValueRef","jobStatus","setJobStatus","undefined","jobProgress","setJobProgress","isJobActive","setIsJobActive","cancelledRef","current","generateUpload","doc","currentInstructionId","fetch","body","JSON","stringify","code","options","instructionId","credentials","headers","method","then","uploadResponse","ok","json","job","result","hasMany","generatedValue","Array","isArray","map","r","merged","currentValue","max","maxRows","truncated","info","success","attempts","maxAttempts","poll","res","jobDoc","progress","result_id","status","valueToSet","relationTo","docRes","url","e","console","error","Promise","resolve","setTimeout","Error","_","errors","errStr","message","join","catch"],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { useForm } from '@payloadcms/ui';
|
|
2
2
|
import { useEffect, useRef } from 'react';
|
|
3
3
|
import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
|
|
4
|
-
import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
|
|
4
|
+
import { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js';
|
|
5
5
|
export const useStreamingUpdate = ({ editor, isLoading, object })=>{
|
|
6
|
-
const { field, path:
|
|
6
|
+
const { field, path: fieldPath } = useFieldProps();
|
|
7
7
|
const { dispatchFields } = useForm();
|
|
8
8
|
// Ref for latest object to avoid effect re-runs during high-frequency streaming
|
|
9
9
|
const objectRef = useRef(object);
|
|
@@ -23,7 +23,7 @@ export const useStreamingUpdate = ({ editor, isLoading, object })=>{
|
|
|
23
23
|
// Use dispatchFields for high-frequency streaming updates to avoid re-renders
|
|
24
24
|
dispatchFields({
|
|
25
25
|
type: 'UPDATE',
|
|
26
|
-
path:
|
|
26
|
+
path: fieldPath ?? '',
|
|
27
27
|
value: currentObject[field.name]
|
|
28
28
|
});
|
|
29
29
|
}
|
|
@@ -41,7 +41,7 @@ export const useStreamingUpdate = ({ editor, isLoading, object })=>{
|
|
|
41
41
|
editor,
|
|
42
42
|
field,
|
|
43
43
|
dispatchFields,
|
|
44
|
-
|
|
44
|
+
fieldPath
|
|
45
45
|
]);
|
|
46
46
|
};
|
|
47
47
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useStreamingUpdate.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\nimport { useForm } from '@payloadcms/ui'\nimport { useEffect, useRef } from 'react'\n\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\n\ntype UseStreamingUpdateParams = {\n editor: LexicalEditor\n isLoading: boolean\n object: any\n}\n\nexport const useStreamingUpdate = ({ editor, isLoading, object }: UseStreamingUpdateParams) => {\n const { field, path:
|
|
1
|
+
{"version":3,"sources":["../../../../src/ui/Compose/hooks/useStreamingUpdate.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\nimport { useForm } from '@payloadcms/ui'\nimport { useEffect, useRef } from 'react'\n\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js'\n\ntype UseStreamingUpdateParams = {\n editor: LexicalEditor\n isLoading: boolean\n object: any\n}\n\nexport const useStreamingUpdate = ({ editor, isLoading, object }: UseStreamingUpdateParams) => {\n const { field, path: fieldPath } = useFieldProps()\n const { dispatchFields } = useForm()\n\n // Ref for latest object to avoid effect re-runs during high-frequency streaming\n const objectRef = useRef(object)\n objectRef.current = object\n\n useEffect(() => {\n // Only run the animation loop while loading (streaming)\n if (!isLoading) {\n return\n }\n\n let reqId: number\n\n const loop = () => {\n const currentObject = objectRef.current\n\n if (currentObject) {\n if (field?.type === 'richText') {\n setSafeLexicalState(currentObject, editor)\n } else if (field && 'name' in field && currentObject[field.name]) {\n // Use dispatchFields for high-frequency streaming updates to avoid re-renders\n dispatchFields({\n type: 'UPDATE',\n path: fieldPath ?? '',\n value: currentObject[field.name],\n } as any)\n }\n }\n\n // Continue loop\n reqId = requestAnimationFrame(loop)\n }\n\n // Start loop\n loop()\n\n return () => {\n cancelAnimationFrame(reqId)\n }\n }, [isLoading, editor, field, dispatchFields, fieldPath])\n}\n"],"names":["useForm","useEffect","useRef","useFieldProps","setSafeLexicalState","useStreamingUpdate","editor","isLoading","object","field","path","fieldPath","dispatchFields","objectRef","current","reqId","loop","currentObject","type","name","value","requestAnimationFrame","cancelAnimationFrame"],"mappings":"AAEA,SAASA,OAAO,QAAQ,iBAAgB;AACxC,SAASC,SAAS,EAAEC,MAAM,QAAQ,QAAO;AAEzC,SAASC,aAAa,QAAQ,oDAAmD;AACjF,SAASC,mBAAmB,QAAQ,oDAAmD;AAQvF,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,MAAM,EAAEC,SAAS,EAAEC,MAAM,EAA4B;IACxF,MAAM,EAAEC,KAAK,EAAEC,MAAMC,SAAS,EAAE,GAAGR;IACnC,MAAM,EAAES,cAAc,EAAE,GAAGZ;IAE3B,gFAAgF;IAChF,MAAMa,YAAYX,OAAOM;IACzBK,UAAUC,OAAO,GAAGN;IAEpBP,UAAU;QACR,wDAAwD;QACxD,IAAI,CAACM,WAAW;YACd;QACF;QAEA,IAAIQ;QAEJ,MAAMC,OAAO;YACX,MAAMC,gBAAgBJ,UAAUC,OAAO;YAEvC,IAAIG,eAAe;gBACjB,IAAIR,OAAOS,SAAS,YAAY;oBAC9Bd,oBAAoBa,eAAeX;gBACrC,OAAO,IAAIG,SAAS,UAAUA,SAASQ,aAAa,CAACR,MAAMU,IAAI,CAAC,EAAE;oBAChE,8EAA8E;oBAC9EP,eAAe;wBACbM,MAAM;wBACNR,MAAMC,aAAa;wBACnBS,OAAOH,aAAa,CAACR,MAAMU,IAAI,CAAC;oBAClC;gBACF;YACF;YAEA,gBAAgB;YAChBJ,QAAQM,sBAAsBL;QAChC;QAEA,aAAa;QACbA;QAEA,OAAO;YACLM,qBAAqBP;QACvB;IACF,GAAG;QAACR;QAAWD;QAAQG;QAAOG;QAAgBD;KAAU;AAC1D,EAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
.wrapper {
|
|
2
|
+
background: var(--theme-elevation-50);
|
|
3
|
+
margin-bottom: 20px;
|
|
4
|
+
overflow: hidden;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
.header {
|
|
8
|
+
align-items: center;
|
|
9
|
+
border-bottom: 1px solid var(--theme-elevation-150);
|
|
10
|
+
display: flex;
|
|
11
|
+
justify-content: space-between;
|
|
12
|
+
padding: 8px var(--gutter-h);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.title {
|
|
16
|
+
margin: 0 0 5px 0;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.subtitle {
|
|
20
|
+
color: var(--theme-elevation-500);
|
|
21
|
+
font-size: 14px;
|
|
22
|
+
margin: 0;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.headerActions {
|
|
26
|
+
display: flex;
|
|
27
|
+
gap: 10px;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.body {
|
|
31
|
+
padding: 24px var(--gutter-h);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
.bodyTitle {
|
|
35
|
+
margin-bottom: 15px;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.grid {
|
|
39
|
+
display: grid;
|
|
40
|
+
gap: 15px;
|
|
41
|
+
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.toggleButton {
|
|
45
|
+
align-items: center;
|
|
46
|
+
border: 1px solid var(--theme-elevation-200);
|
|
47
|
+
border-radius: 6px;
|
|
48
|
+
background: var(--theme-elevation-50);
|
|
49
|
+
cursor: pointer;
|
|
50
|
+
display: flex;
|
|
51
|
+
gap: 10px;
|
|
52
|
+
padding: 10px 15px;
|
|
53
|
+
text-align: left;
|
|
54
|
+
transition: all 0.2s ease;
|
|
55
|
+
width: 100%;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.toggleButton[data-enabled='true'] {
|
|
59
|
+
background: var(--theme-elevation-100);
|
|
60
|
+
border-color: var(--theme-text-success);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.toggleTrack {
|
|
64
|
+
align-items: center;
|
|
65
|
+
background: var(--theme-elevation-200);
|
|
66
|
+
border-radius: 12px;
|
|
67
|
+
display: flex;
|
|
68
|
+
height: 24px;
|
|
69
|
+
justify-content: flex-start;
|
|
70
|
+
padding: 2px;
|
|
71
|
+
transition: all 0.2s ease;
|
|
72
|
+
width: 44px;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
.toggleButton[data-enabled='true'] .toggleTrack {
|
|
76
|
+
background: var(--theme-text-success);
|
|
77
|
+
justify-content: flex-end;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.toggleKnob {
|
|
81
|
+
background: white;
|
|
82
|
+
border-radius: 50%;
|
|
83
|
+
height: 20px;
|
|
84
|
+
width: 20px;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.toggleLabel {
|
|
88
|
+
font-weight: 500;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
.loading {
|
|
92
|
+
padding: 20px;
|
|
93
|
+
text-align: center;
|
|
94
|
+
}
|