@ai-stack/payloadcms 3.76.0-beta.1 → 3.76.0-beta.3
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 +7 -24
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
- package/dist/ai/core/media/image/handlers/standard.js +7 -2
- package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
- package/dist/ai/core/media/speech/generateSpeech.js +2 -3
- package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
- package/dist/ai/core/media/types.d.ts +2 -3
- 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 +2 -44
- package/dist/ai/providers/blocks/anthropic.js.map +1 -1
- package/dist/ai/providers/blocks/elevenlabs.js +4 -109
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
- package/dist/ai/providers/blocks/fal.js +2 -120
- package/dist/ai/providers/blocks/fal.js.map +1 -1
- package/dist/ai/providers/blocks/google.js +6 -240
- package/dist/ai/providers/blocks/google.js.map +1 -1
- package/dist/ai/providers/blocks/openai-compatible.js +2 -146
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
- package/dist/ai/providers/blocks/openai.js +2 -202
- package/dist/ai/providers/blocks/openai.js.map +1 -1
- package/dist/ai/providers/blocks/xai.js +2 -55
- 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 +184 -138
- 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/{utils → utilities}/nodeToSchemaMap.js +6 -6
- 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.js +56 -29
- package/dist/collections/AIProviders.js.map +1 -1
- package/dist/collections/Instructions.js +91 -59
- 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/endpoints/fetchFields.js +14 -6
- package/dist/endpoints/fetchFields.js.map +1 -1
- package/dist/endpoints/fetchVoices.js +1 -1
- 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 -639
- 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 +2 -1
- package/dist/exports/client.js +2 -1
- 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/LexicalEditor/feature.server.js +1 -1
- package/dist/fields/LexicalEditor/feature.server.js.map +1 -1
- 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 +18 -21
- package/dist/plugin.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.js +11 -20
- package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
- package/dist/providers/FieldProvider/FieldProvider.jsx +8 -18
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +5 -2
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +5 -2
- 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 +64 -28
- 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.js +15 -5
- package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +11 -5
- 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/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/useGenerate.js +37 -12
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerateUpload.js +66 -24
- package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
- package/dist/ui/Compose/hooks/useHistory.js +1 -1
- package/dist/ui/Compose/hooks/useHistory.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.js +27 -92
- package/dist/ui/ConfigDashboard/index.js.map +1 -1
- package/dist/ui/ConfigDashboard/index.jsx +24 -77
- 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 +54 -22
- package/dist/utilities/seedProperties.js.map +1 -1
- package/package.json +36 -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/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 -224
- package/dist/ui/AIConfigDashboard/index.js.map +0 -1
- package/dist/ui/AIConfigDashboard/index.jsx +0 -175
- 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/{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
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
|
-
import {
|
|
4
|
-
import { getSiblingData } from 'payload/shared';
|
|
3
|
+
import { useConfig, useField, useLocale, useTranslation } from '@payloadcms/ui';
|
|
5
4
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
6
5
|
import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
|
|
7
|
-
import { Compose, Proofread, Rephrase } from './items.js';
|
|
6
|
+
import { Compose, Proofread, Rephrase, Translate } from './items.js';
|
|
8
7
|
import { menuItemsMap } from './itemsMap.js';
|
|
9
8
|
import styles from './menu.module.scss';
|
|
10
9
|
const getActiveComponent = (ac)=>{
|
|
@@ -15,36 +14,47 @@ const getActiveComponent = (ac)=>{
|
|
|
15
14
|
return Proofread;
|
|
16
15
|
case 'Rephrase':
|
|
17
16
|
return Rephrase;
|
|
17
|
+
case 'Translate':
|
|
18
|
+
return Translate;
|
|
18
19
|
default:
|
|
19
20
|
return Rephrase;
|
|
20
21
|
}
|
|
21
22
|
};
|
|
22
23
|
export const useMenu = (menuEvents, options)=>{
|
|
23
24
|
const { field: { type: fieldType } = {}, path } = useFieldProps();
|
|
24
|
-
const {
|
|
25
|
+
const { value } = useField({
|
|
26
|
+
path: path || ''
|
|
27
|
+
});
|
|
28
|
+
const { config } = useConfig();
|
|
29
|
+
const locale = useLocale();
|
|
30
|
+
const { t } = useTranslation();
|
|
25
31
|
const [activeComponent, setActiveComponent] = useState('Rephrase');
|
|
26
|
-
// Check value
|
|
32
|
+
// Check value whenever it changes
|
|
27
33
|
useEffect(()=>{
|
|
28
34
|
let hasValue = false;
|
|
29
35
|
try {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
// But for now, simple truthiness covers most cases or at least defaults safely
|
|
36
|
-
if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {
|
|
37
|
-
// Basic lexical check could go here if needed
|
|
38
|
-
}
|
|
36
|
+
hasValue = value !== undefined && value !== null;
|
|
37
|
+
// For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
|
|
38
|
+
// But for now, simple truthiness covers most cases or at least defaults safely
|
|
39
|
+
if (fieldType === 'richText' && value && typeof value === 'object' && 'root' in value) {
|
|
40
|
+
// Basic lexical check could go here if needed
|
|
39
41
|
}
|
|
40
42
|
} catch (e) {
|
|
41
43
|
// ignore
|
|
42
44
|
}
|
|
43
45
|
if (!hasValue) {
|
|
44
|
-
|
|
46
|
+
const defaultLocale = config?.localization ? config.localization.defaultLocale : undefined;
|
|
47
|
+
const translateItem = menuItemsMap.find((i)=>i.name === 'Translate');
|
|
48
|
+
const isTranslateExcluded = translateItem?.excludedFor?.includes(fieldType ?? '');
|
|
49
|
+
if (!isTranslateExcluded && locale?.code && defaultLocale && locale.code !== defaultLocale) {
|
|
50
|
+
setActiveComponent('Translate');
|
|
51
|
+
} else {
|
|
52
|
+
setActiveComponent('Compose');
|
|
53
|
+
}
|
|
45
54
|
return;
|
|
46
55
|
}
|
|
47
|
-
|
|
56
|
+
const rephraseItem = menuItemsMap.find((i)=>i.name === 'Rephrase');
|
|
57
|
+
if (rephraseItem?.excludedFor?.includes(fieldType ?? '')) {
|
|
48
58
|
setActiveComponent('Compose');
|
|
49
59
|
return;
|
|
50
60
|
}
|
|
@@ -52,8 +62,9 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
52
62
|
setActiveComponent('Rephrase');
|
|
53
63
|
}, [
|
|
54
64
|
fieldType,
|
|
55
|
-
|
|
56
|
-
|
|
65
|
+
value,
|
|
66
|
+
locale?.code,
|
|
67
|
+
config?.localization
|
|
57
68
|
]);
|
|
58
69
|
const MemoizedActiveComponent = useMemo(()=>{
|
|
59
70
|
return ({ isLoading, loadingLabel, stop })=>{
|
|
@@ -65,7 +76,16 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
65
76
|
if (!isLoading) {
|
|
66
77
|
const trigger = menuEvents[`on${activeComponent}`];
|
|
67
78
|
if (typeof trigger === 'function') {
|
|
68
|
-
|
|
79
|
+
const isEvent = data && typeof data === 'object' && 'nativeEvent' in data;
|
|
80
|
+
const actualData = isEvent ? undefined : data;
|
|
81
|
+
if (activeComponent === 'Translate' && !actualData) {
|
|
82
|
+
trigger({
|
|
83
|
+
locale: locale?.code,
|
|
84
|
+
translateFromDefault: true
|
|
85
|
+
});
|
|
86
|
+
} else {
|
|
87
|
+
trigger(actualData);
|
|
88
|
+
}
|
|
69
89
|
} else {
|
|
70
90
|
console.error('No trigger found for', activeComponent);
|
|
71
91
|
}
|
|
@@ -73,13 +93,15 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
73
93
|
stop();
|
|
74
94
|
}
|
|
75
95
|
},
|
|
76
|
-
title: isLoading ? '
|
|
77
|
-
children: isLoading && (loadingLabel ?? activeItem.loadingText)
|
|
96
|
+
title: isLoading ? t('ai-plugin:general:clickToStop') : t(`ai-plugin:actions:${activeItem.name.toLowerCase()}`),
|
|
97
|
+
children: isLoading && (loadingLabel ?? (activeItem.loadingText ? t(`ai-plugin:actionLoading:${activeItem.loadingText.toLowerCase()}`) : null))
|
|
78
98
|
});
|
|
79
99
|
};
|
|
80
100
|
}, [
|
|
81
101
|
activeComponent,
|
|
82
|
-
menuEvents
|
|
102
|
+
menuEvents,
|
|
103
|
+
t,
|
|
104
|
+
locale?.code
|
|
83
105
|
]);
|
|
84
106
|
const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>{
|
|
85
107
|
if (i.name === 'Settings' && !options.isConfigAllowed) {
|
|
@@ -105,7 +127,7 @@ export const useMenu = (menuEvents, options)=>{
|
|
|
105
127
|
menuEvents[`on${i.name}`]?.(data);
|
|
106
128
|
onClose();
|
|
107
129
|
},
|
|
108
|
-
children: isLoading && i.loadingText
|
|
130
|
+
children: isLoading && i.loadingText && t(`ai-plugin:actionLoading:${i.loadingText.toLowerCase()}`)
|
|
109
131
|
}, i.name);
|
|
110
132
|
})
|
|
111
133
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useForm } from '@payloadcms/ui'\nimport { getSiblingData } from 'payload/shared'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents, UseMenuOptions } from '../../../../types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac: ActionMenuItems) => {\n switch (ac) {\n case 'Compose':\n return Compose\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents, options: UseMenuOptions) => {\n const { field: { type: fieldType } = {}, path } = useFieldProps()\n const { getData } = useForm()\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n // Check value once on mount or when path/type changes\n useEffect(() => {\n let hasValue = false\n\n try {\n const data = getData()\n if (path) {\n const val = getSiblingData(data, path)\n hasValue = val !== undefined && val !== null\n // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)\n // But for now, simple truthiness covers most cases or at least defaults safely\n if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {\n // Basic lexical check could go here if needed\n }\n }\n } catch (e) {\n // ignore\n }\n\n if (!hasValue) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType ?? ''))) {\n setActiveComponent('Compose')\n return\n }\n\n // Default to Rephrase if value exists\n setActiveComponent('Rephrase')\n }, [fieldType, getData, path])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading, loadingLabel, stop }: { isLoading: boolean; loadingLabel?: string; stop: () => void }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)!\n return (\n <ActiveComponent\n hideIcon\n onClick={(data: unknown) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n trigger(data)\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={isLoading ? 'Click to stop' : activeItem.name}\n >\n {isLoading && (loadingLabel ?? activeItem.loadingText)}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => {\n if (i.name === 'Settings' && !options.isConfigAllowed) {\n return false\n } // Disable settings if a user role is not permitted\n return i.name !== activeComponent && !i.excludedFor?.includes(fieldType ?? '')\n }),\n [activeComponent, fieldType, options.isConfigAllowed],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }: { isLoading: boolean; onClose: () => void }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data: unknown) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`]?.(data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n\n"],"names":["useForm","getSiblingData","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","options","field","type","fieldType","path","getData","activeComponent","setActiveComponent","hasValue","data","val","undefined","e","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","loadingLabel","stop","ActiveComponent","activeItem","find","name","hideIcon","onClick","trigger","console","error","title","loadingText","filteredMenuItems","filter","isConfigAllowed","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useConfig, useField, useLocale, useTranslation } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type {\n PluginAITranslationKeys,\n PluginAITranslations,\n} from '../../../../translations/index.js'\nimport type { ActionMenuItems } from '../../../../types.js'\nimport type { UseMenuEvents, UseMenuOptions } from './types.js'\n\nimport { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js'\nimport { Compose, Proofread, Rephrase, Translate } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac: ActionMenuItems) => {\n switch (ac) {\n case 'Compose':\n return Compose\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Translate':\n return Translate\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents, options: UseMenuOptions) => {\n const { field: { type: fieldType } = {}, path } = useFieldProps()\n const { value } = useField<any>({ path: path || '' })\n const { config } = useConfig()\n const locale = useLocale()\n const { t } = useTranslation<PluginAITranslations, PluginAITranslationKeys>()\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n // Check value whenever it changes\n useEffect(() => {\n let hasValue = false\n\n try {\n hasValue = value !== undefined && value !== null\n // For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)\n // But for now, simple truthiness covers most cases or at least defaults safely\n if (fieldType === 'richText' && value && typeof value === 'object' && 'root' in value) {\n // Basic lexical check could go here if needed\n }\n } catch (e) {\n // ignore\n }\n\n if (!hasValue) {\n const defaultLocale = config?.localization ? config.localization.defaultLocale : undefined\n const translateItem = menuItemsMap.find((i) => i.name === 'Translate')\n const isTranslateExcluded = translateItem?.excludedFor?.includes(fieldType ?? '')\n\n if (!isTranslateExcluded && locale?.code && defaultLocale && locale.code !== defaultLocale) {\n setActiveComponent('Translate')\n } else {\n setActiveComponent('Compose')\n }\n return\n }\n\n const rephraseItem = menuItemsMap.find((i) => i.name === 'Rephrase')\n if (rephraseItem?.excludedFor?.includes(fieldType ?? '')) {\n setActiveComponent('Compose')\n return\n }\n\n // Default to Rephrase if value exists\n setActiveComponent('Rephrase')\n }, [fieldType, value, locale?.code, config?.localization])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({\n isLoading,\n loadingLabel,\n stop,\n }: {\n isLoading: boolean\n loadingLabel?: string\n stop: () => void\n }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)!\n return (\n <ActiveComponent\n hideIcon\n onClick={(data: unknown) => {\n if (!isLoading) {\n const trigger = menuEvents[`on${activeComponent}`]\n if (typeof trigger === 'function') {\n const isEvent = data && typeof data === 'object' && 'nativeEvent' in data\n const actualData = isEvent ? undefined : data\n\n if (activeComponent === 'Translate' && !actualData) {\n trigger({ locale: locale?.code, translateFromDefault: true })\n } else {\n trigger(actualData)\n }\n } else {\n console.error('No trigger found for', activeComponent)\n }\n } else {\n stop()\n }\n }}\n title={\n isLoading\n ? t('ai-plugin:general:clickToStop' as any)\n : t(`ai-plugin:actions:${activeItem.name.toLowerCase()}` as any)\n }\n >\n {isLoading &&\n (loadingLabel ??\n (activeItem.loadingText ? t(`ai-plugin:actionLoading:${activeItem.loadingText.toLowerCase()}` as any) : null))}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents, t, locale?.code])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => {\n if (i.name === 'Settings' && !options.isConfigAllowed) {\n return false\n } // Disable settings if a user role is not permitted\n return i.name !== activeComponent && !i.excludedFor?.includes(fieldType ?? '')\n }),\n [activeComponent, fieldType, options.isConfigAllowed],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }: { isLoading: boolean; onClose: () => void }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data: unknown) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`]?.(data)\n onClose()\n }}\n >\n {isLoading && i.loadingText && t(`ai-plugin:actionLoading:${i.loadingText.toLowerCase()}` as any)}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useConfig","useField","useLocale","useTranslation","React","useEffect","useMemo","useState","useFieldProps","Compose","Proofread","Rephrase","Translate","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","options","field","type","fieldType","path","value","config","locale","t","activeComponent","setActiveComponent","hasValue","undefined","e","defaultLocale","localization","translateItem","find","i","name","isTranslateExcluded","excludedFor","includes","code","rephraseItem","MemoizedActiveComponent","isLoading","loadingLabel","stop","ActiveComponent","activeItem","hideIcon","onClick","data","trigger","isEvent","actualData","translateFromDefault","console","error","title","toLowerCase","loadingText","filteredMenuItems","filter","isConfigAllowed","MemoizedMenu","onClose","div","className","menu","map","Action","component","disabled","Menu"],"mappings":"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"}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import {
|
|
3
|
-
import { getSiblingData } from 'payload/shared';
|
|
2
|
+
import { useConfig, useField, useLocale, useTranslation } from '@payloadcms/ui';
|
|
4
3
|
import React, { useEffect, useMemo, useState } from 'react';
|
|
5
4
|
import { useFieldProps } from '../../../../providers/FieldProvider/useFieldProps.js';
|
|
6
|
-
import { Compose, Proofread, Rephrase } from './items.js';
|
|
5
|
+
import { Compose, Proofread, Rephrase, Translate } from './items.js';
|
|
7
6
|
import { menuItemsMap } from './itemsMap.js';
|
|
8
7
|
import styles from './menu.module.scss';
|
|
9
8
|
const getActiveComponent = (ac) => {
|
|
@@ -14,52 +13,69 @@ const getActiveComponent = (ac) => {
|
|
|
14
13
|
return Proofread;
|
|
15
14
|
case 'Rephrase':
|
|
16
15
|
return Rephrase;
|
|
16
|
+
case 'Translate':
|
|
17
|
+
return Translate;
|
|
17
18
|
default:
|
|
18
19
|
return Rephrase;
|
|
19
20
|
}
|
|
20
21
|
};
|
|
21
22
|
export const useMenu = (menuEvents, options) => {
|
|
22
23
|
const { field: { type: fieldType } = {}, path } = useFieldProps();
|
|
23
|
-
const {
|
|
24
|
+
const { value } = useField({ path: path || '' });
|
|
25
|
+
const { config } = useConfig();
|
|
26
|
+
const locale = useLocale();
|
|
27
|
+
const { t } = useTranslation();
|
|
24
28
|
const [activeComponent, setActiveComponent] = useState('Rephrase');
|
|
25
|
-
// Check value
|
|
29
|
+
// Check value whenever it changes
|
|
26
30
|
useEffect(() => {
|
|
27
31
|
let hasValue = false;
|
|
28
32
|
try {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
// But for now, simple truthiness covers most cases or at least defaults safely
|
|
35
|
-
if (fieldType === 'richText' && val && typeof val === 'object' && 'root' in val) {
|
|
36
|
-
// Basic lexical check could go here if needed
|
|
37
|
-
}
|
|
33
|
+
hasValue = value !== undefined && value !== null;
|
|
34
|
+
// For richTextFields, we might need a more robust check (e.g. check for root.children.length > 0)
|
|
35
|
+
// But for now, simple truthiness covers most cases or at least defaults safely
|
|
36
|
+
if (fieldType === 'richText' && value && typeof value === 'object' && 'root' in value) {
|
|
37
|
+
// Basic lexical check could go here if needed
|
|
38
38
|
}
|
|
39
39
|
}
|
|
40
40
|
catch (e) {
|
|
41
41
|
// ignore
|
|
42
42
|
}
|
|
43
43
|
if (!hasValue) {
|
|
44
|
-
|
|
44
|
+
const defaultLocale = config?.localization ? config.localization.defaultLocale : undefined;
|
|
45
|
+
const translateItem = menuItemsMap.find((i) => i.name === 'Translate');
|
|
46
|
+
const isTranslateExcluded = translateItem?.excludedFor?.includes(fieldType ?? '');
|
|
47
|
+
if (!isTranslateExcluded && locale?.code && defaultLocale && locale.code !== defaultLocale) {
|
|
48
|
+
setActiveComponent('Translate');
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
setActiveComponent('Compose');
|
|
52
|
+
}
|
|
45
53
|
return;
|
|
46
54
|
}
|
|
47
|
-
|
|
55
|
+
const rephraseItem = menuItemsMap.find((i) => i.name === 'Rephrase');
|
|
56
|
+
if (rephraseItem?.excludedFor?.includes(fieldType ?? '')) {
|
|
48
57
|
setActiveComponent('Compose');
|
|
49
58
|
return;
|
|
50
59
|
}
|
|
51
60
|
// Default to Rephrase if value exists
|
|
52
61
|
setActiveComponent('Rephrase');
|
|
53
|
-
}, [fieldType,
|
|
62
|
+
}, [fieldType, value, locale?.code, config?.localization]);
|
|
54
63
|
const MemoizedActiveComponent = useMemo(() => {
|
|
55
|
-
return ({ isLoading, loadingLabel, stop }) => {
|
|
64
|
+
return ({ isLoading, loadingLabel, stop, }) => {
|
|
56
65
|
const ActiveComponent = getActiveComponent(activeComponent);
|
|
57
66
|
const activeItem = menuItemsMap.find((i) => i.name === activeComponent);
|
|
58
67
|
return (<ActiveComponent hideIcon onClick={(data) => {
|
|
59
68
|
if (!isLoading) {
|
|
60
69
|
const trigger = menuEvents[`on${activeComponent}`];
|
|
61
70
|
if (typeof trigger === 'function') {
|
|
62
|
-
|
|
71
|
+
const isEvent = data && typeof data === 'object' && 'nativeEvent' in data;
|
|
72
|
+
const actualData = isEvent ? undefined : data;
|
|
73
|
+
if (activeComponent === 'Translate' && !actualData) {
|
|
74
|
+
trigger({ locale: locale?.code, translateFromDefault: true });
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
trigger(actualData);
|
|
78
|
+
}
|
|
63
79
|
}
|
|
64
80
|
else {
|
|
65
81
|
console.error('No trigger found for', activeComponent);
|
|
@@ -68,11 +84,15 @@ export const useMenu = (menuEvents, options) => {
|
|
|
68
84
|
else {
|
|
69
85
|
stop();
|
|
70
86
|
}
|
|
71
|
-
}} title={isLoading
|
|
72
|
-
|
|
87
|
+
}} title={isLoading
|
|
88
|
+
? t('ai-plugin:general:clickToStop')
|
|
89
|
+
: t(`ai-plugin:actions:${activeItem.name.toLowerCase()}`)}>
|
|
90
|
+
{isLoading &&
|
|
91
|
+
(loadingLabel ??
|
|
92
|
+
(activeItem.loadingText ? t(`ai-plugin:actionLoading:${activeItem.loadingText.toLowerCase()}`) : null))}
|
|
73
93
|
</ActiveComponent>);
|
|
74
94
|
};
|
|
75
|
-
}, [activeComponent, menuEvents]);
|
|
95
|
+
}, [activeComponent, menuEvents, t, locale?.code]);
|
|
76
96
|
const filteredMenuItems = useMemo(() => menuItemsMap.filter((i) => {
|
|
77
97
|
if (i.name === 'Settings' && !options.isConfigAllowed) {
|
|
78
98
|
return false;
|
|
@@ -90,7 +110,7 @@ export const useMenu = (menuEvents, options) => {
|
|
|
90
110
|
menuEvents[`on${i.name}`]?.(data);
|
|
91
111
|
onClose();
|
|
92
112
|
}}>
|
|
93
|
-
{isLoading && i.loadingText}
|
|
113
|
+
{isLoading && i.loadingText && t(`ai-plugin:actionLoading:${i.loadingText.toLowerCase()}`)}
|
|
94
114
|
</Action>);
|
|
95
115
|
})}
|
|
96
116
|
</div>);
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type MergeGeneratedValueArgs = {
|
|
2
|
+
appendGenerated: boolean;
|
|
3
|
+
currentValue: unknown;
|
|
4
|
+
generatedValue: unknown;
|
|
5
|
+
hasMany: boolean;
|
|
6
|
+
max?: number;
|
|
7
|
+
maxRows?: number;
|
|
8
|
+
};
|
|
9
|
+
type MergeGeneratedValueResult = {
|
|
10
|
+
truncated: boolean;
|
|
11
|
+
value: unknown;
|
|
12
|
+
};
|
|
13
|
+
export declare const mergeGeneratedValue: ({ appendGenerated, currentValue, generatedValue, hasMany, max, maxRows, }: MergeGeneratedValueArgs) => MergeGeneratedValueResult;
|
|
14
|
+
export {};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
const toArray = (value)=>{
|
|
2
|
+
if (Array.isArray(value)) {
|
|
3
|
+
return value;
|
|
4
|
+
}
|
|
5
|
+
if (value === null || value === undefined || value === '') {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
return [
|
|
9
|
+
value
|
|
10
|
+
];
|
|
11
|
+
};
|
|
12
|
+
export const mergeGeneratedValue = ({ appendGenerated, currentValue, generatedValue, hasMany, max, maxRows })=>{
|
|
13
|
+
if (!appendGenerated || !hasMany) {
|
|
14
|
+
return {
|
|
15
|
+
truncated: false,
|
|
16
|
+
value: generatedValue
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
const current = toArray(currentValue);
|
|
20
|
+
const generated = toArray(generatedValue);
|
|
21
|
+
const merged = [
|
|
22
|
+
...current,
|
|
23
|
+
...generated
|
|
24
|
+
];
|
|
25
|
+
const limit = typeof maxRows === 'number' ? maxRows : typeof max === 'number' ? max : undefined;
|
|
26
|
+
if (typeof limit === 'number' && limit >= 0 && merged.length > limit) {
|
|
27
|
+
return {
|
|
28
|
+
truncated: true,
|
|
29
|
+
value: merged.slice(0, limit)
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
truncated: false,
|
|
34
|
+
value: merged
|
|
35
|
+
};
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
//# sourceMappingURL=mergeGeneratedValue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/ui/Compose/hooks/mergeGeneratedValue.ts"],"sourcesContent":["type MergeGeneratedValueArgs = {\n appendGenerated: boolean\n currentValue: unknown\n generatedValue: unknown\n hasMany: boolean\n max?: number\n maxRows?: number\n}\n\ntype MergeGeneratedValueResult = {\n truncated: boolean\n value: unknown\n}\n\nconst toArray = (value: unknown): unknown[] => {\n if (Array.isArray(value)) {\n return value\n }\n\n if (value === null || value === undefined || value === '') {\n return []\n }\n\n return [value]\n}\n\nexport const mergeGeneratedValue = ({\n appendGenerated,\n currentValue,\n generatedValue,\n hasMany,\n max,\n maxRows,\n}: MergeGeneratedValueArgs): MergeGeneratedValueResult => {\n if (!appendGenerated || !hasMany) {\n return {\n truncated: false,\n value: generatedValue,\n }\n }\n\n const current = toArray(currentValue)\n const generated = toArray(generatedValue)\n\n const merged = [...current, ...generated]\n const limit = typeof maxRows === 'number' ? maxRows : typeof max === 'number' ? max : undefined\n\n if (typeof limit === 'number' && limit >= 0 && merged.length > limit) {\n return {\n truncated: true,\n value: merged.slice(0, limit),\n }\n }\n\n return {\n truncated: false,\n value: merged,\n }\n}\n"],"names":["toArray","value","Array","isArray","undefined","mergeGeneratedValue","appendGenerated","currentValue","generatedValue","hasMany","max","maxRows","truncated","current","generated","merged","limit","length","slice"],"mappings":"AAcA,MAAMA,UAAU,CAACC;IACf,IAAIC,MAAMC,OAAO,CAACF,QAAQ;QACxB,OAAOA;IACT;IAEA,IAAIA,UAAU,QAAQA,UAAUG,aAAaH,UAAU,IAAI;QACzD,OAAO,EAAE;IACX;IAEA,OAAO;QAACA;KAAM;AAChB;AAEA,OAAO,MAAMI,sBAAsB,CAAC,EAClCC,eAAe,EACfC,YAAY,EACZC,cAAc,EACdC,OAAO,EACPC,GAAG,EACHC,OAAO,EACiB;IACxB,IAAI,CAACL,mBAAmB,CAACG,SAAS;QAChC,OAAO;YACLG,WAAW;YACXX,OAAOO;QACT;IACF;IAEA,MAAMK,UAAUb,QAAQO;IACxB,MAAMO,YAAYd,QAAQQ;IAE1B,MAAMO,SAAS;WAAIF;WAAYC;KAAU;IACzC,MAAME,QAAQ,OAAOL,YAAY,WAAWA,UAAU,OAAOD,QAAQ,WAAWA,MAAMN;IAEtF,IAAI,OAAOY,UAAU,YAAYA,SAAS,KAAKD,OAAOE,MAAM,GAAGD,OAAO;QACpE,OAAO;YACLJ,WAAW;YACXX,OAAOc,OAAOG,KAAK,CAAC,GAAGF;QACzB;IACF;IAEA,OAAO;QACLJ,WAAW;QACXX,OAAOc;IACT;AACF,EAAC"}
|
|
@@ -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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"}
|