@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,7 +1,9 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { SelectInput, useField, useFormFields } from '@payloadcms/ui';
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
4
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
5
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
6
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
5
7
|
/**
|
|
6
8
|
* Find a field by name within a block's fields, searching through tabs
|
|
7
9
|
*/
|
|
@@ -82,26 +84,8 @@ export const DynamicModelSelect = (props) => {
|
|
|
82
84
|
return providers;
|
|
83
85
|
});
|
|
84
86
|
const { setValue, value } = useField({ path });
|
|
85
|
-
|
|
86
|
-
const
|
|
87
|
-
// Fetch AI Settings global to get configured providers
|
|
88
|
-
useEffect(() => {
|
|
89
|
-
const fetchSettings = async () => {
|
|
90
|
-
try {
|
|
91
|
-
const response = await fetch('/api/globals/ai-providers?depth=1');
|
|
92
|
-
if (response.ok) {
|
|
93
|
-
const data = await response.json();
|
|
94
|
-
if (data && data.providers) {
|
|
95
|
-
setProvidersData(data.providers);
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
catch (error) {
|
|
100
|
-
console.error('Error fetching AI settings:', error);
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
fetchSettings().catch(console.error);
|
|
104
|
-
}, []);
|
|
87
|
+
const { data: aiSettings } = useAISettings();
|
|
88
|
+
const providersData = aiSettings?.providers ?? [];
|
|
105
89
|
const inferredUseCase = useMemo(() => inferUseCase(path), [path]);
|
|
106
90
|
const options = useMemo(() => {
|
|
107
91
|
if (!providerValue) {
|
|
@@ -195,13 +179,6 @@ export const DynamicModelSelect = (props) => {
|
|
|
195
179
|
<label className="field-label" htmlFor={path}>
|
|
196
180
|
Model
|
|
197
181
|
</label>
|
|
198
|
-
<SelectInput name={name} onChange={(option) => {
|
|
199
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
200
|
-
setValue(option.value);
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
setValue(option);
|
|
204
|
-
}
|
|
205
|
-
}} options={options} path={path} value={value}/>
|
|
182
|
+
<SelectInput name={name} onChange={(option) => handleSelectChange(setValue, option)} options={options} path={path} value={value}/>
|
|
206
183
|
</div>);
|
|
207
184
|
};
|
|
@@ -1,32 +1,17 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { SelectInput, useField } from '@payloadcms/ui';
|
|
4
|
-
import React, {
|
|
4
|
+
import React, { useMemo } from 'react';
|
|
5
5
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
6
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
7
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
6
8
|
export const DynamicProviderSelect = (props)=>{
|
|
7
9
|
const { name, path } = props;
|
|
8
10
|
const { setValue, value } = useField({
|
|
9
11
|
path
|
|
10
12
|
});
|
|
11
|
-
|
|
12
|
-
const
|
|
13
|
-
// Fetch AI Settings global to get configured providers
|
|
14
|
-
useEffect(()=>{
|
|
15
|
-
const fetchSettings = async ()=>{
|
|
16
|
-
try {
|
|
17
|
-
const response = await fetch('/api/globals/ai-providers?depth=1');
|
|
18
|
-
if (response.ok) {
|
|
19
|
-
const data = await response.json();
|
|
20
|
-
if (data && data.providers) {
|
|
21
|
-
setProvidersData(data.providers);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
} catch (error) {
|
|
25
|
-
console.error('Error fetching AI settings:', error);
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
void fetchSettings();
|
|
29
|
-
}, []);
|
|
13
|
+
const { data: aiSettings } = useAISettings();
|
|
14
|
+
const providersData = aiSettings?.providers ?? [];
|
|
30
15
|
const options = useMemo(()=>{
|
|
31
16
|
const optionsList = [];
|
|
32
17
|
const processedProviders = new Set();
|
|
@@ -83,13 +68,7 @@ export const DynamicProviderSelect = (props)=>{
|
|
|
83
68
|
}),
|
|
84
69
|
/*#__PURE__*/ _jsx(SelectInput, {
|
|
85
70
|
name: name,
|
|
86
|
-
onChange: (option)=>
|
|
87
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
88
|
-
setValue(option.value);
|
|
89
|
-
} else {
|
|
90
|
-
setValue(option);
|
|
91
|
-
}
|
|
92
|
-
},
|
|
71
|
+
onChange: (option)=>handleSelectChange(setValue, option),
|
|
93
72
|
options: options,
|
|
94
73
|
path: path,
|
|
95
74
|
value: value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/DynamicProviderSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField } from '@payloadcms/ui'\nimport React, {
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/DynamicProviderSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField } from '@payloadcms/ui'\nimport React, { useMemo } from 'react'\n\nimport { allProviderBlocks } from '../../ai/providers/blocks/index.js'\nimport { useAISettings } from '../hooks/useAISettings.js'\nimport { handleSelectChange } from '../shared/handleSelectChange.js'\n\ntype Props = {\n name: string\n path: string\n}\n\nexport const DynamicProviderSelect: React.FC<Props> = (props) => {\n const { name, path } = props\n\n const { setValue, value } = useField<string>({ path })\n\n const { data: aiSettings } = useAISettings()\n const providersData = aiSettings?.providers ?? []\n\n const options = useMemo(() => {\n const optionsList: { label: string; value: string }[] = []\n const processedProviders = new Set<string>()\n\n // Iterate through fetched providers to find custom names\n providersData.forEach((provider: any) => {\n if (!provider.enabled) {\n return\n }\n\n const blockType = provider.blockType\n const customName = provider.providerName\n\n // Get static label as fallback\n const staticBlock = allProviderBlocks.find((b) => b.slug === blockType)\n const staticLabel = staticBlock?.labels?.singular\n ? typeof staticBlock.labels.singular === 'string'\n ? staticBlock.labels.singular\n : blockType\n : blockType\n\n const label = customName || staticLabel\n\n if (!processedProviders.has(blockType)) {\n optionsList.push({\n label,\n value: blockType,\n })\n processedProviders.add(blockType)\n } else if (customName) {\n // Update existing label if custom name is available\n const existingOpt = optionsList.find((o) => o.value === blockType)\n if (existingOpt && existingOpt.label === staticLabel) {\n existingOpt.label = customName\n }\n }\n })\n\n // Add any other available providers from blocks that might not be configured yet?\n // Usually we only want to show configured providers in the selection list.\n // But for standard providers (OpenAI, Google), they might not need much config other than API key.\n // If they are not in the list, user can't select them.\n // However, if they are not enabled in settings, maybe we shouldn't show them?\n // Let's stick to showing all available blocks, but prioritizing configured ones with custom names.\n\n allProviderBlocks.forEach((block) => {\n if (!processedProviders.has(block.slug)) {\n optionsList.push({\n label: typeof block.labels?.singular === 'string' ? block.labels.singular : block.slug,\n value: block.slug,\n })\n }\n })\n\n return optionsList\n }, [providersData])\n\n return (\n <div className=\"field-type select\">\n <label className=\"field-label\" htmlFor={path}>\n Provider\n </label>\n <SelectInput\n name={name}\n onChange={(option) => handleSelectChange(setValue, option)}\n options={options as any}\n path={path}\n value={value}\n />\n </div>\n )\n}\n"],"names":["SelectInput","useField","React","useMemo","allProviderBlocks","useAISettings","handleSelectChange","DynamicProviderSelect","props","name","path","setValue","value","data","aiSettings","providersData","providers","options","optionsList","processedProviders","Set","forEach","provider","enabled","blockType","customName","providerName","staticBlock","find","b","slug","staticLabel","labels","singular","label","has","push","add","existingOpt","o","block","div","className","htmlFor","onChange","option"],"mappings":"AAAA;;AAEA,SAASA,WAAW,EAAEC,QAAQ,QAAQ,iBAAgB;AACtD,OAAOC,SAASC,OAAO,QAAQ,QAAO;AAEtC,SAASC,iBAAiB,QAAQ,qCAAoC;AACtE,SAASC,aAAa,QAAQ,4BAA2B;AACzD,SAASC,kBAAkB,QAAQ,kCAAiC;AAOpE,OAAO,MAAMC,wBAAyC,CAACC;IACrD,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGF;IAEvB,MAAM,EAAEG,QAAQ,EAAEC,KAAK,EAAE,GAAGX,SAAiB;QAAES;IAAK;IAEpD,MAAM,EAAEG,MAAMC,UAAU,EAAE,GAAGT;IAC7B,MAAMU,gBAAgBD,YAAYE,aAAa,EAAE;IAEjD,MAAMC,UAAUd,QAAQ;QACtB,MAAMe,cAAkD,EAAE;QAC1D,MAAMC,qBAAqB,IAAIC;QAE/B,yDAAyD;QACzDL,cAAcM,OAAO,CAAC,CAACC;YACrB,IAAI,CAACA,SAASC,OAAO,EAAE;gBACrB;YACF;YAEA,MAAMC,YAAYF,SAASE,SAAS;YACpC,MAAMC,aAAaH,SAASI,YAAY;YAExC,+BAA+B;YAC/B,MAAMC,cAAcvB,kBAAkBwB,IAAI,CAAC,CAACC,IAAMA,EAAEC,IAAI,KAAKN;YAC7D,MAAMO,cAAcJ,aAAaK,QAAQC,WACrC,OAAON,YAAYK,MAAM,CAACC,QAAQ,KAAK,WACrCN,YAAYK,MAAM,CAACC,QAAQ,GAC3BT,YACFA;YAEJ,MAAMU,QAAQT,cAAcM;YAE5B,IAAI,CAACZ,mBAAmBgB,GAAG,CAACX,YAAY;gBACtCN,YAAYkB,IAAI,CAAC;oBACfF;oBACAtB,OAAOY;gBACT;gBACAL,mBAAmBkB,GAAG,CAACb;YACzB,OAAO,IAAIC,YAAY;gBACrB,oDAAoD;gBACpD,MAAMa,cAAcpB,YAAYU,IAAI,CAAC,CAACW,IAAMA,EAAE3B,KAAK,KAAKY;gBACxD,IAAIc,eAAeA,YAAYJ,KAAK,KAAKH,aAAa;oBACpDO,YAAYJ,KAAK,GAAGT;gBACtB;YACF;QACF;QAEA,kFAAkF;QAClF,2EAA2E;QAC3E,mGAAmG;QACnG,uDAAuD;QACvD,8EAA8E;QAC9E,mGAAmG;QAEnGrB,kBAAkBiB,OAAO,CAAC,CAACmB;YACzB,IAAI,CAACrB,mBAAmBgB,GAAG,CAACK,MAAMV,IAAI,GAAG;gBACvCZ,YAAYkB,IAAI,CAAC;oBACfF,OAAO,OAAOM,MAAMR,MAAM,EAAEC,aAAa,WAAWO,MAAMR,MAAM,CAACC,QAAQ,GAAGO,MAAMV,IAAI;oBACtFlB,OAAO4B,MAAMV,IAAI;gBACnB;YACF;QACF;QAEA,OAAOZ;IACT,GAAG;QAACH;KAAc;IAElB,qBACE,MAAC0B;QAAIC,WAAU;;0BACb,KAACR;gBAAMQ,WAAU;gBAAcC,SAASjC;0BAAM;;0BAG9C,KAACV;gBACCS,MAAMA;gBACNmC,UAAU,CAACC,SAAWvC,mBAAmBK,UAAUkC;gBACnD5B,SAASA;gBACTP,MAAMA;gBACNE,OAAOA;;;;AAIf,EAAC"}
|
|
@@ -1,30 +1,14 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { SelectInput, useField } from '@payloadcms/ui';
|
|
3
|
-
import React, {
|
|
3
|
+
import React, { useMemo } from 'react';
|
|
4
4
|
import { allProviderBlocks } from '../../ai/providers/blocks/index.js';
|
|
5
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
6
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
5
7
|
export const DynamicProviderSelect = (props) => {
|
|
6
8
|
const { name, path } = props;
|
|
7
9
|
const { setValue, value } = useField({ path });
|
|
8
|
-
|
|
9
|
-
const
|
|
10
|
-
// Fetch AI Settings global to get configured providers
|
|
11
|
-
useEffect(() => {
|
|
12
|
-
const fetchSettings = async () => {
|
|
13
|
-
try {
|
|
14
|
-
const response = await fetch('/api/globals/ai-providers?depth=1');
|
|
15
|
-
if (response.ok) {
|
|
16
|
-
const data = await response.json();
|
|
17
|
-
if (data && data.providers) {
|
|
18
|
-
setProvidersData(data.providers);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
catch (error) {
|
|
23
|
-
console.error('Error fetching AI settings:', error);
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
void fetchSettings();
|
|
27
|
-
}, []);
|
|
10
|
+
const { data: aiSettings } = useAISettings();
|
|
11
|
+
const providersData = aiSettings?.providers ?? [];
|
|
28
12
|
const options = useMemo(() => {
|
|
29
13
|
const optionsList = [];
|
|
30
14
|
const processedProviders = new Set();
|
|
@@ -78,13 +62,6 @@ export const DynamicProviderSelect = (props) => {
|
|
|
78
62
|
<label className="field-label" htmlFor={path}>
|
|
79
63
|
Provider
|
|
80
64
|
</label>
|
|
81
|
-
<SelectInput name={name} onChange={(option) => {
|
|
82
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
83
|
-
setValue(option.value);
|
|
84
|
-
}
|
|
85
|
-
else {
|
|
86
|
-
setValue(option);
|
|
87
|
-
}
|
|
88
|
-
}} options={options} path={path} value={value}/>
|
|
65
|
+
<SelectInput name={name} onChange={(option) => handleSelectChange(setValue, option)} options={options} path={path} value={value}/>
|
|
89
66
|
</div>);
|
|
90
67
|
};
|
|
@@ -1,7 +1,26 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { SelectInput, useField, useFormFields } from '@payloadcms/ui';
|
|
4
|
-
import React, { useEffect, useMemo
|
|
4
|
+
import React, { useEffect, useMemo } from 'react';
|
|
5
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
6
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
7
|
+
const StatusMessage = ({ label, message, path })=>/*#__PURE__*/ _jsxs("div", {
|
|
8
|
+
className: "field-type text",
|
|
9
|
+
children: [
|
|
10
|
+
/*#__PURE__*/ _jsx("label", {
|
|
11
|
+
className: "field-label",
|
|
12
|
+
htmlFor: path,
|
|
13
|
+
children: label
|
|
14
|
+
}),
|
|
15
|
+
/*#__PURE__*/ _jsx("p", {
|
|
16
|
+
style: {
|
|
17
|
+
color: 'var(--theme-elevation-600)',
|
|
18
|
+
fontSize: '13px'
|
|
19
|
+
},
|
|
20
|
+
children: message
|
|
21
|
+
})
|
|
22
|
+
]
|
|
23
|
+
});
|
|
5
24
|
export const DynamicVoiceSelect = (props)=>{
|
|
6
25
|
const { name, path } = props;
|
|
7
26
|
// Get provider from siblings
|
|
@@ -13,29 +32,7 @@ export const DynamicVoiceSelect = (props)=>{
|
|
|
13
32
|
const { setValue, value } = useField({
|
|
14
33
|
path
|
|
15
34
|
});
|
|
16
|
-
const
|
|
17
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
18
|
-
// Fetch AI Settings - re-fetch when provider changes to ensure we have latest voices
|
|
19
|
-
useEffect(()=>{
|
|
20
|
-
const fetchSettings = async ()=>{
|
|
21
|
-
setIsLoading(true);
|
|
22
|
-
try {
|
|
23
|
-
const response = await fetch('/api/globals/ai-providers?depth=1');
|
|
24
|
-
if (response.ok) {
|
|
25
|
-
const data = await response.json();
|
|
26
|
-
setAiSettings(data);
|
|
27
|
-
}
|
|
28
|
-
} catch (err) {
|
|
29
|
-
console.error('Error fetching AI settings:', err);
|
|
30
|
-
} finally{
|
|
31
|
-
setIsLoading(false);
|
|
32
|
-
}
|
|
33
|
-
};
|
|
34
|
-
void fetchSettings();
|
|
35
|
-
}, [
|
|
36
|
-
provider
|
|
37
|
-
]) // Re-fetch when provider changes to ensure we have the latest voices
|
|
38
|
-
;
|
|
35
|
+
const { data: aiSettings, isLoading } = useAISettings();
|
|
39
36
|
const voices = useMemo(()=>{
|
|
40
37
|
if (!provider || !aiSettings?.providers) {
|
|
41
38
|
return [];
|
|
@@ -68,64 +65,24 @@ export const DynamicVoiceSelect = (props)=>{
|
|
|
68
65
|
setValue
|
|
69
66
|
]);
|
|
70
67
|
if (!provider) {
|
|
71
|
-
return /*#__PURE__*/
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
className: "field-label",
|
|
76
|
-
htmlFor: path,
|
|
77
|
-
children: "Voice"
|
|
78
|
-
}),
|
|
79
|
-
/*#__PURE__*/ _jsx("p", {
|
|
80
|
-
style: {
|
|
81
|
-
color: 'var(--theme-elevation-600)',
|
|
82
|
-
fontSize: '13px'
|
|
83
|
-
},
|
|
84
|
-
children: "Please select a provider first."
|
|
85
|
-
})
|
|
86
|
-
]
|
|
68
|
+
return /*#__PURE__*/ _jsx(StatusMessage, {
|
|
69
|
+
label: "Voice",
|
|
70
|
+
message: "Please select a provider first.",
|
|
71
|
+
path: path
|
|
87
72
|
});
|
|
88
73
|
}
|
|
89
74
|
if (isLoading) {
|
|
90
|
-
return /*#__PURE__*/
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
className: "field-label",
|
|
95
|
-
htmlFor: path,
|
|
96
|
-
children: "Voice"
|
|
97
|
-
}),
|
|
98
|
-
/*#__PURE__*/ _jsx("p", {
|
|
99
|
-
style: {
|
|
100
|
-
color: 'var(--theme-elevation-600)',
|
|
101
|
-
fontSize: '13px'
|
|
102
|
-
},
|
|
103
|
-
children: "Loading voices..."
|
|
104
|
-
})
|
|
105
|
-
]
|
|
75
|
+
return /*#__PURE__*/ _jsx(StatusMessage, {
|
|
76
|
+
label: "Voice",
|
|
77
|
+
message: "Loading voices...",
|
|
78
|
+
path: path
|
|
106
79
|
});
|
|
107
80
|
}
|
|
108
81
|
if (voices.length === 0) {
|
|
109
|
-
return /*#__PURE__*/
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
className: "field-label",
|
|
114
|
-
htmlFor: path,
|
|
115
|
-
children: "Voice"
|
|
116
|
-
}),
|
|
117
|
-
/*#__PURE__*/ _jsxs("p", {
|
|
118
|
-
style: {
|
|
119
|
-
color: 'var(--theme-elevation-600)',
|
|
120
|
-
fontSize: '13px'
|
|
121
|
-
},
|
|
122
|
-
children: [
|
|
123
|
-
"No voices available. Please configure voices in AI Settings for ",
|
|
124
|
-
provider,
|
|
125
|
-
"."
|
|
126
|
-
]
|
|
127
|
-
})
|
|
128
|
-
]
|
|
82
|
+
return /*#__PURE__*/ _jsx(StatusMessage, {
|
|
83
|
+
label: "Voice",
|
|
84
|
+
message: `No voices available. Please configure voices in AI Settings for ${provider}.`,
|
|
85
|
+
path: path
|
|
129
86
|
});
|
|
130
87
|
}
|
|
131
88
|
return /*#__PURE__*/ _jsxs("div", {
|
|
@@ -138,13 +95,7 @@ export const DynamicVoiceSelect = (props)=>{
|
|
|
138
95
|
}),
|
|
139
96
|
/*#__PURE__*/ _jsx(SelectInput, {
|
|
140
97
|
name: name,
|
|
141
|
-
onChange: (option)=>
|
|
142
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
143
|
-
setValue(option.value);
|
|
144
|
-
} else {
|
|
145
|
-
setValue(option);
|
|
146
|
-
}
|
|
147
|
-
},
|
|
98
|
+
onChange: (option)=>handleSelectChange(setValue, option),
|
|
148
99
|
options: voices,
|
|
149
100
|
path: path,
|
|
150
101
|
value: value
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/DynamicVoiceSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField, useFormFields } from '@payloadcms/ui'\nimport React, { useEffect, useMemo
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/DynamicVoiceSelect/index.tsx"],"sourcesContent":["'use client'\n\nimport { SelectInput, useField, useFormFields } from '@payloadcms/ui'\nimport React, { useEffect, useMemo } from 'react'\n\nimport type { Voice } from '../shared/types.js'\n\nimport { useAISettings } from '../hooks/useAISettings.js'\nimport { handleSelectChange } from '../shared/handleSelectChange.js'\n\ntype Props = {\n name: string\n path: string\n}\n\ninterface ProviderBlock {\n blockType: string\n enabled?: boolean\n voices?: Voice[]\n}\n\nconst StatusMessage: React.FC<{ label: string; message: string; path: string }> = ({ label, message, path }) => (\n <div className=\"field-type text\">\n <label className=\"field-label\" htmlFor={path}>\n {label}\n </label>\n <p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px' }}>\n {message}\n </p>\n </div>\n)\n\nexport const DynamicVoiceSelect: React.FC<Props> = (props) => {\n const { name, path } = props\n\n // Get provider from siblings\n const parentPath = path.split('.').slice(0, -1).join('.')\n const providerPath = `${parentPath}.provider`\n\n // Use useFormFields to get the provider field value - this will re-render when provider changes\n const providerField = useFormFields(([fields]) => fields[providerPath])\n const provider = (providerField?.value as string) || ''\n\n const { setValue, value } = useField<string>({ path })\n const { data: aiSettings, isLoading } = useAISettings()\n\n const voices = useMemo(() => {\n if (!provider || !aiSettings?.providers) {\n return []\n }\n\n // Find the provider block matching the selected provider\n const providerBlock = aiSettings.providers.find(\n (p: ProviderBlock) => p.blockType === provider && p.enabled !== false,\n ) as ProviderBlock | undefined\n\n if (!providerBlock?.voices) {\n return []\n }\n\n // Get enabled voices from provider block\n return providerBlock.voices\n .filter((v: Voice) => v.enabled !== false)\n .map((v: Voice) => ({\n label: v.name || v.id,\n value: v.id,\n }))\n }, [provider, aiSettings])\n\n // Clear voice selection when provider changes and current voice is not available\n useEffect(() => {\n if (value && voices.length > 0) {\n const voiceExists = voices.some((v) => v.value === value)\n if (!voiceExists) {\n setValue('')\n }\n }\n }, [voices, value, setValue])\n\n if (!provider) {\n return <StatusMessage label=\"Voice\" message=\"Please select a provider first.\" path={path} />\n }\n\n if (isLoading) {\n return <StatusMessage label=\"Voice\" message=\"Loading voices...\" path={path} />\n }\n\n if (voices.length === 0) {\n return (\n <StatusMessage\n label=\"Voice\"\n message={`No voices available. Please configure voices in AI Settings for ${provider}.`}\n path={path}\n />\n )\n }\n\n return (\n <div className=\"field-type select\">\n <label className=\"field-label\" htmlFor={path}>\n Voice\n </label>\n <SelectInput\n name={name}\n onChange={(option) => handleSelectChange(setValue, option)}\n options={voices}\n path={path}\n value={value}\n />\n </div>\n )\n}\n\n"],"names":["SelectInput","useField","useFormFields","React","useEffect","useMemo","useAISettings","handleSelectChange","StatusMessage","label","message","path","div","className","htmlFor","p","style","color","fontSize","DynamicVoiceSelect","props","name","parentPath","split","slice","join","providerPath","providerField","fields","provider","value","setValue","data","aiSettings","isLoading","voices","providers","providerBlock","find","blockType","enabled","filter","v","map","id","length","voiceExists","some","onChange","option","options"],"mappings":"AAAA;;AAEA,SAASA,WAAW,EAAEC,QAAQ,EAAEC,aAAa,QAAQ,iBAAgB;AACrE,OAAOC,SAASC,SAAS,EAAEC,OAAO,QAAQ,QAAO;AAIjD,SAASC,aAAa,QAAQ,4BAA2B;AACzD,SAASC,kBAAkB,QAAQ,kCAAiC;AAapE,MAAMC,gBAA4E,CAAC,EAAEC,KAAK,EAAEC,OAAO,EAAEC,IAAI,EAAE,iBACzG,MAACC;QAAIC,WAAU;;0BACb,KAACJ;gBAAMI,WAAU;gBAAcC,SAASH;0BACrCF;;0BAEH,KAACM;gBAAEC,OAAO;oBAAEC,OAAO;oBAA8BC,UAAU;gBAAO;0BAC/DR;;;;AAKP,OAAO,MAAMS,qBAAsC,CAACC;IAClD,MAAM,EAAEC,IAAI,EAAEV,IAAI,EAAE,GAAGS;IAEvB,6BAA6B;IAC7B,MAAME,aAAaX,KAAKY,KAAK,CAAC,KAAKC,KAAK,CAAC,GAAG,CAAC,GAAGC,IAAI,CAAC;IACrD,MAAMC,eAAe,CAAC,EAAEJ,WAAW,SAAS,CAAC;IAE7C,gGAAgG;IAChG,MAAMK,gBAAgBzB,cAAc,CAAC,CAAC0B,OAAO,GAAKA,MAAM,CAACF,aAAa;IACtE,MAAMG,WAAW,AAACF,eAAeG,SAAoB;IAErD,MAAM,EAAEC,QAAQ,EAAED,KAAK,EAAE,GAAG7B,SAAiB;QAAEU;IAAK;IACpD,MAAM,EAAEqB,MAAMC,UAAU,EAAEC,SAAS,EAAE,GAAG5B;IAExC,MAAM6B,SAAS9B,QAAQ;QACrB,IAAI,CAACwB,YAAY,CAACI,YAAYG,WAAW;YACvC,OAAO,EAAE;QACX;QAEA,yDAAyD;QACzD,MAAMC,gBAAgBJ,WAAWG,SAAS,CAACE,IAAI,CAC7C,CAACvB,IAAqBA,EAAEwB,SAAS,KAAKV,YAAYd,EAAEyB,OAAO,KAAK;QAGlE,IAAI,CAACH,eAAeF,QAAQ;YAC1B,OAAO,EAAE;QACX;QAEA,yCAAyC;QACzC,OAAOE,cAAcF,MAAM,CACxBM,MAAM,CAAC,CAACC,IAAaA,EAAEF,OAAO,KAAK,OACnCG,GAAG,CAAC,CAACD,IAAc,CAAA;gBAClBjC,OAAOiC,EAAErB,IAAI,IAAIqB,EAAEE,EAAE;gBACrBd,OAAOY,EAAEE,EAAE;YACb,CAAA;IACJ,GAAG;QAACf;QAAUI;KAAW;IAEzB,iFAAiF;IACjF7B,UAAU;QACR,IAAI0B,SAASK,OAAOU,MAAM,GAAG,GAAG;YAC9B,MAAMC,cAAcX,OAAOY,IAAI,CAAC,CAACL,IAAMA,EAAEZ,KAAK,KAAKA;YACnD,IAAI,CAACgB,aAAa;gBAChBf,SAAS;YACX;QACF;IACF,GAAG;QAACI;QAAQL;QAAOC;KAAS;IAE5B,IAAI,CAACF,UAAU;QACb,qBAAO,KAACrB;YAAcC,OAAM;YAAQC,SAAQ;YAAkCC,MAAMA;;IACtF;IAEA,IAAIuB,WAAW;QACb,qBAAO,KAAC1B;YAAcC,OAAM;YAAQC,SAAQ;YAAoBC,MAAMA;;IACxE;IAEA,IAAIwB,OAAOU,MAAM,KAAK,GAAG;QACvB,qBACE,KAACrC;YACCC,OAAM;YACNC,SAAS,CAAC,gEAAgE,EAAEmB,SAAS,CAAC,CAAC;YACvFlB,MAAMA;;IAGZ;IAEA,qBACE,MAACC;QAAIC,WAAU;;0BACb,KAACJ;gBAAMI,WAAU;gBAAcC,SAASH;0BAAM;;0BAG9C,KAACX;gBACCqB,MAAMA;gBACN2B,UAAU,CAACC,SAAW1C,mBAAmBwB,UAAUkB;gBACnDC,SAASf;gBACTxB,MAAMA;gBACNmB,OAAOA;;;;AAIf,EAAC"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
'use client';
|
|
2
2
|
import { SelectInput, useField, useFormFields } from '@payloadcms/ui';
|
|
3
|
-
import React, { useEffect, useMemo
|
|
3
|
+
import React, { useEffect, useMemo } from 'react';
|
|
4
|
+
import { useAISettings } from '../hooks/useAISettings.js';
|
|
5
|
+
import { handleSelectChange } from '../shared/handleSelectChange.js';
|
|
6
|
+
const StatusMessage = ({ label, message, path }) => (<div className="field-type text">
|
|
7
|
+
<label className="field-label" htmlFor={path}>
|
|
8
|
+
{label}
|
|
9
|
+
</label>
|
|
10
|
+
<p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px' }}>
|
|
11
|
+
{message}
|
|
12
|
+
</p>
|
|
13
|
+
</div>);
|
|
4
14
|
export const DynamicVoiceSelect = (props) => {
|
|
5
15
|
const { name, path } = props;
|
|
6
16
|
// Get provider from siblings
|
|
@@ -10,28 +20,7 @@ export const DynamicVoiceSelect = (props) => {
|
|
|
10
20
|
const providerField = useFormFields(([fields]) => fields[providerPath]);
|
|
11
21
|
const provider = providerField?.value || '';
|
|
12
22
|
const { setValue, value } = useField({ path });
|
|
13
|
-
const
|
|
14
|
-
const [isLoading, setIsLoading] = useState(true);
|
|
15
|
-
// Fetch AI Settings - re-fetch when provider changes to ensure we have latest voices
|
|
16
|
-
useEffect(() => {
|
|
17
|
-
const fetchSettings = async () => {
|
|
18
|
-
setIsLoading(true);
|
|
19
|
-
try {
|
|
20
|
-
const response = await fetch('/api/globals/ai-providers?depth=1');
|
|
21
|
-
if (response.ok) {
|
|
22
|
-
const data = await response.json();
|
|
23
|
-
setAiSettings(data);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
catch (err) {
|
|
27
|
-
console.error('Error fetching AI settings:', err);
|
|
28
|
-
}
|
|
29
|
-
finally {
|
|
30
|
-
setIsLoading(false);
|
|
31
|
-
}
|
|
32
|
-
};
|
|
33
|
-
void fetchSettings();
|
|
34
|
-
}, [provider]); // Re-fetch when provider changes to ensure we have the latest voices
|
|
23
|
+
const { data: aiSettings, isLoading } = useAISettings();
|
|
35
24
|
const voices = useMemo(() => {
|
|
36
25
|
if (!provider || !aiSettings?.providers) {
|
|
37
26
|
return [];
|
|
@@ -59,44 +48,18 @@ export const DynamicVoiceSelect = (props) => {
|
|
|
59
48
|
}
|
|
60
49
|
}, [voices, value, setValue]);
|
|
61
50
|
if (!provider) {
|
|
62
|
-
return
|
|
63
|
-
<label className="field-label" htmlFor={path}>
|
|
64
|
-
Voice
|
|
65
|
-
</label>
|
|
66
|
-
<p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px' }}>
|
|
67
|
-
Please select a provider first.
|
|
68
|
-
</p>
|
|
69
|
-
</div>);
|
|
51
|
+
return <StatusMessage label="Voice" message="Please select a provider first." path={path}/>;
|
|
70
52
|
}
|
|
71
53
|
if (isLoading) {
|
|
72
|
-
return
|
|
73
|
-
<label className="field-label" htmlFor={path}>
|
|
74
|
-
Voice
|
|
75
|
-
</label>
|
|
76
|
-
<p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px' }}>Loading voices...</p>
|
|
77
|
-
</div>);
|
|
54
|
+
return <StatusMessage label="Voice" message="Loading voices..." path={path}/>;
|
|
78
55
|
}
|
|
79
56
|
if (voices.length === 0) {
|
|
80
|
-
return (<
|
|
81
|
-
<label className="field-label" htmlFor={path}>
|
|
82
|
-
Voice
|
|
83
|
-
</label>
|
|
84
|
-
<p style={{ color: 'var(--theme-elevation-600)', fontSize: '13px' }}>
|
|
85
|
-
No voices available. Please configure voices in AI Settings for {provider}.
|
|
86
|
-
</p>
|
|
87
|
-
</div>);
|
|
57
|
+
return (<StatusMessage label="Voice" message={`No voices available. Please configure voices in AI Settings for ${provider}.`} path={path}/>);
|
|
88
58
|
}
|
|
89
59
|
return (<div className="field-type select">
|
|
90
60
|
<label className="field-label" htmlFor={path}>
|
|
91
61
|
Voice
|
|
92
62
|
</label>
|
|
93
|
-
<SelectInput name={name} onChange={(option) => {
|
|
94
|
-
if (option && typeof option === 'object' && 'value' in option) {
|
|
95
|
-
setValue(option.value);
|
|
96
|
-
}
|
|
97
|
-
else {
|
|
98
|
-
setValue(option);
|
|
99
|
-
}
|
|
100
|
-
}} options={voices} path={path} value={value}/>
|
|
63
|
+
<SelectInput name={name} onChange={(option) => handleSelectChange(setValue, option)} options={voices} path={path} value={value}/>
|
|
101
64
|
</div>);
|
|
102
65
|
};
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useField, useFormFields } from '@payloadcms/ui';
|
|
4
|
+
import * as React from 'react';
|
|
5
|
+
import { useCallback } from 'react';
|
|
6
|
+
import { ProviderOptionsTree } from '../InstructionProviderOptions/ProviderOptionsTree.js';
|
|
7
|
+
import { updateProviderOptionsValue } from '../providerOptions/updateProviderOptionsValue.js';
|
|
8
|
+
function isRecord(value) {
|
|
9
|
+
return !!value && typeof value === 'object' && !Array.isArray(value);
|
|
10
|
+
}
|
|
11
|
+
export const GlobalProviderOptions = ({ path })=>{
|
|
12
|
+
const fieldPath = String(path || '');
|
|
13
|
+
const groupPath = fieldPath.split('.').slice(0, -1).join('.');
|
|
14
|
+
const providerPath = `${groupPath}.provider`;
|
|
15
|
+
const schemaPath = `${groupPath}.schema`;
|
|
16
|
+
const providerField = useFormFields(([fields])=>fields[providerPath]);
|
|
17
|
+
const schemaField = useFormFields(([fields])=>fields[schemaPath]);
|
|
18
|
+
const provider = typeof providerField?.value === 'string' ? providerField.value : undefined;
|
|
19
|
+
const schemaByProvider = isRecord(schemaField?.value) ? schemaField.value : {};
|
|
20
|
+
const schema = provider && isRecord(schemaByProvider[provider]) ? schemaByProvider[provider] : null;
|
|
21
|
+
const { setValue: setProviderOptionsValue, value: providerOptionsValue } = useField({
|
|
22
|
+
path: fieldPath
|
|
23
|
+
});
|
|
24
|
+
const handleOptionChange = useCallback((keyPath, targetValue)=>{
|
|
25
|
+
const nextValue = updateProviderOptionsValue({
|
|
26
|
+
currentValue: providerOptionsValue,
|
|
27
|
+
keyPath,
|
|
28
|
+
provider,
|
|
29
|
+
targetValue
|
|
30
|
+
});
|
|
31
|
+
setProviderOptionsValue(nextValue);
|
|
32
|
+
}, [
|
|
33
|
+
provider,
|
|
34
|
+
providerOptionsValue,
|
|
35
|
+
setProviderOptionsValue
|
|
36
|
+
]);
|
|
37
|
+
if (!provider) {
|
|
38
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
39
|
+
className: "field-type",
|
|
40
|
+
style: {
|
|
41
|
+
marginTop: '1rem'
|
|
42
|
+
},
|
|
43
|
+
children: [
|
|
44
|
+
/*#__PURE__*/ _jsx("div", {
|
|
45
|
+
className: "field-label",
|
|
46
|
+
children: "Provider Options"
|
|
47
|
+
}),
|
|
48
|
+
/*#__PURE__*/ _jsx("p", {
|
|
49
|
+
style: {
|
|
50
|
+
color: 'var(--theme-elevation-500)',
|
|
51
|
+
margin: 0
|
|
52
|
+
},
|
|
53
|
+
children: "Select a provider to configure provider options."
|
|
54
|
+
})
|
|
55
|
+
]
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
if (!schema || Object.keys(schema).length === 0) {
|
|
59
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
60
|
+
className: "field-type",
|
|
61
|
+
style: {
|
|
62
|
+
marginTop: '1rem'
|
|
63
|
+
},
|
|
64
|
+
children: [
|
|
65
|
+
/*#__PURE__*/ _jsx("div", {
|
|
66
|
+
className: "field-label",
|
|
67
|
+
children: "Provider Options"
|
|
68
|
+
}),
|
|
69
|
+
/*#__PURE__*/ _jsx("p", {
|
|
70
|
+
style: {
|
|
71
|
+
color: 'var(--theme-elevation-500)',
|
|
72
|
+
margin: 0
|
|
73
|
+
},
|
|
74
|
+
children: "No provider options schema exists for this provider and capability."
|
|
75
|
+
})
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
const selectedProviderValues = isRecord(providerOptionsValue) && isRecord(providerOptionsValue[provider]) ? providerOptionsValue[provider] : {};
|
|
80
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
81
|
+
className: "field-type",
|
|
82
|
+
style: {
|
|
83
|
+
marginTop: '1rem'
|
|
84
|
+
},
|
|
85
|
+
children: [
|
|
86
|
+
/*#__PURE__*/ _jsx("div", {
|
|
87
|
+
className: "field-label",
|
|
88
|
+
children: "Provider Options"
|
|
89
|
+
}),
|
|
90
|
+
/*#__PURE__*/ _jsxs("p", {
|
|
91
|
+
style: {
|
|
92
|
+
color: 'var(--theme-elevation-500)',
|
|
93
|
+
marginBottom: '0.75rem',
|
|
94
|
+
marginTop: 0
|
|
95
|
+
},
|
|
96
|
+
children: [
|
|
97
|
+
"Configure default provider options for ",
|
|
98
|
+
provider,
|
|
99
|
+
"."
|
|
100
|
+
]
|
|
101
|
+
}),
|
|
102
|
+
/*#__PURE__*/ _jsx("div", {
|
|
103
|
+
style: {
|
|
104
|
+
display: 'flex',
|
|
105
|
+
flexDirection: 'column'
|
|
106
|
+
},
|
|
107
|
+
children: /*#__PURE__*/ _jsx(ProviderOptionsTree, {
|
|
108
|
+
onChange: handleOptionChange,
|
|
109
|
+
path: [],
|
|
110
|
+
schemaValue: schema,
|
|
111
|
+
selectedValue: selectedProviderValues
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
]
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/GlobalProviderOptions/index.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldClientComponent } from 'payload'\n\nimport { useField, useFormFields } from '@payloadcms/ui'\nimport * as React from 'react'\nimport { useCallback } from 'react'\n\nimport { ProviderOptionsTree } from '../InstructionProviderOptions/ProviderOptionsTree.js'\nimport { updateProviderOptionsValue } from '../providerOptions/updateProviderOptionsValue.js'\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nexport const GlobalProviderOptions: FieldClientComponent = ({ path }) => {\n const fieldPath = String(path || '')\n const groupPath = fieldPath.split('.').slice(0, -1).join('.')\n const providerPath = `${groupPath}.provider`\n const schemaPath = `${groupPath}.schema`\n\n const providerField = useFormFields(([fields]) => fields[providerPath])\n const schemaField = useFormFields(([fields]) => fields[schemaPath])\n const provider = typeof providerField?.value === 'string' ? providerField.value : undefined\n\n const schemaByProvider = isRecord(schemaField?.value) ? schemaField.value : {}\n const schema = provider && isRecord(schemaByProvider[provider]) ? schemaByProvider[provider] : null\n\n const { setValue: setProviderOptionsValue, value: providerOptionsValue } = useField<unknown>({\n path: fieldPath,\n })\n\n const handleOptionChange = useCallback(\n (keyPath: string[], targetValue: unknown) => {\n const nextValue = updateProviderOptionsValue({\n currentValue: providerOptionsValue,\n keyPath,\n provider,\n targetValue,\n })\n setProviderOptionsValue(nextValue)\n },\n [provider, providerOptionsValue, setProviderOptionsValue],\n )\n\n if (!provider) {\n return (\n <div className=\"field-type\" style={{ marginTop: '1rem' }}>\n <div className=\"field-label\">Provider Options</div>\n <p style={{ color: 'var(--theme-elevation-500)', margin: 0 }}>\n Select a provider to configure provider options.\n </p>\n </div>\n )\n }\n\n if (!schema || Object.keys(schema).length === 0) {\n return (\n <div className=\"field-type\" style={{ marginTop: '1rem' }}>\n <div className=\"field-label\">Provider Options</div>\n <p style={{ color: 'var(--theme-elevation-500)', margin: 0 }}>\n No provider options schema exists for this provider and capability.\n </p>\n </div>\n )\n }\n\n const selectedProviderValues =\n isRecord(providerOptionsValue) && isRecord(providerOptionsValue[provider])\n ? providerOptionsValue[provider]\n : {}\n\n return (\n <div className=\"field-type\" style={{ marginTop: '1rem' }}>\n <div className=\"field-label\">Provider Options</div>\n <p style={{ color: 'var(--theme-elevation-500)', marginBottom: '0.75rem', marginTop: 0 }}>\n Configure default provider options for {provider}.\n </p>\n <div style={{ display: 'flex', flexDirection: 'column' }}>\n <ProviderOptionsTree\n onChange={handleOptionChange}\n path={[]}\n schemaValue={schema}\n selectedValue={selectedProviderValues}\n />\n </div>\n </div>\n )\n}\n"],"names":["useField","useFormFields","React","useCallback","ProviderOptionsTree","updateProviderOptionsValue","isRecord","value","Array","isArray","GlobalProviderOptions","path","fieldPath","String","groupPath","split","slice","join","providerPath","schemaPath","providerField","fields","schemaField","provider","undefined","schemaByProvider","schema","setValue","setProviderOptionsValue","providerOptionsValue","handleOptionChange","keyPath","targetValue","nextValue","currentValue","div","className","style","marginTop","p","color","margin","Object","keys","length","selectedProviderValues","marginBottom","display","flexDirection","onChange","schemaValue","selectedValue"],"mappings":"AAAA;;AAIA,SAASA,QAAQ,EAAEC,aAAa,QAAQ,iBAAgB;AACxD,YAAYC,WAAW,QAAO;AAC9B,SAASC,WAAW,QAAQ,QAAO;AAEnC,SAASC,mBAAmB,QAAQ,uDAAsD;AAC1F,SAASC,0BAA0B,QAAQ,mDAAkD;AAE7F,SAASC,SAASC,KAAc;IAC9B,OAAO,CAAC,CAACA,SAAS,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF;AAChE;AAEA,OAAO,MAAMG,wBAA8C,CAAC,EAAEC,IAAI,EAAE;IAClE,MAAMC,YAAYC,OAAOF,QAAQ;IACjC,MAAMG,YAAYF,UAAUG,KAAK,CAAC,KAAKC,KAAK,CAAC,GAAG,CAAC,GAAGC,IAAI,CAAC;IACzD,MAAMC,eAAe,CAAC,EAAEJ,UAAU,SAAS,CAAC;IAC5C,MAAMK,aAAa,CAAC,EAAEL,UAAU,OAAO,CAAC;IAExC,MAAMM,gBAAgBnB,cAAc,CAAC,CAACoB,OAAO,GAAKA,MAAM,CAACH,aAAa;IACtE,MAAMI,cAAcrB,cAAc,CAAC,CAACoB,OAAO,GAAKA,MAAM,CAACF,WAAW;IAClE,MAAMI,WAAW,OAAOH,eAAeb,UAAU,WAAWa,cAAcb,KAAK,GAAGiB;IAElF,MAAMC,mBAAmBnB,SAASgB,aAAaf,SAASe,YAAYf,KAAK,GAAG,CAAC;IAC7E,MAAMmB,SAASH,YAAYjB,SAASmB,gBAAgB,CAACF,SAAS,IAAIE,gBAAgB,CAACF,SAAS,GAAG;IAE/F,MAAM,EAAEI,UAAUC,uBAAuB,EAAErB,OAAOsB,oBAAoB,EAAE,GAAG7B,SAAkB;QAC3FW,MAAMC;IACR;IAEA,MAAMkB,qBAAqB3B,YACzB,CAAC4B,SAAmBC;QAClB,MAAMC,YAAY5B,2BAA2B;YAC3C6B,cAAcL;YACdE;YACAR;YACAS;QACF;QACAJ,wBAAwBK;IAC1B,GACA;QAACV;QAAUM;QAAsBD;KAAwB;IAG3D,IAAI,CAACL,UAAU;QACb,qBACE,MAACY;YAAIC,WAAU;YAAaC,OAAO;gBAAEC,WAAW;YAAO;;8BACrD,KAACH;oBAAIC,WAAU;8BAAc;;8BAC7B,KAACG;oBAAEF,OAAO;wBAAEG,OAAO;wBAA8BC,QAAQ;oBAAE;8BAAG;;;;IAKpE;IAEA,IAAI,CAACf,UAAUgB,OAAOC,IAAI,CAACjB,QAAQkB,MAAM,KAAK,GAAG;QAC/C,qBACE,MAACT;YAAIC,WAAU;YAAaC,OAAO;gBAAEC,WAAW;YAAO;;8BACrD,KAACH;oBAAIC,WAAU;8BAAc;;8BAC7B,KAACG;oBAAEF,OAAO;wBAAEG,OAAO;wBAA8BC,QAAQ;oBAAE;8BAAG;;;;IAKpE;IAEA,MAAMI,yBACJvC,SAASuB,yBAAyBvB,SAASuB,oBAAoB,CAACN,SAAS,IACrEM,oBAAoB,CAACN,SAAS,GAC9B,CAAC;IAEP,qBACE,MAACY;QAAIC,WAAU;QAAaC,OAAO;YAAEC,WAAW;QAAO;;0BACrD,KAACH;gBAAIC,WAAU;0BAAc;;0BAC7B,MAACG;gBAAEF,OAAO;oBAAEG,OAAO;oBAA8BM,cAAc;oBAAWR,WAAW;gBAAE;;oBAAG;oBAChDf;oBAAS;;;0BAEnD,KAACY;gBAAIE,OAAO;oBAAEU,SAAS;oBAAQC,eAAe;gBAAS;0BACrD,cAAA,KAAC5C;oBACC6C,UAAUnB;oBACVnB,MAAM,EAAE;oBACRuC,aAAaxB;oBACbyB,eAAeN;;;;;AAKzB,EAAC"}
|