@ai-stack/payloadcms 3.68.0 → 3.76.0-beta.0
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/media/image/generateImage.js +2 -6
- package/dist/ai/core/media/image/generateImage.js.map +1 -1
- package/dist/ai/core/media/image/handlers/multimodal.js +5 -0
- package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
- package/dist/ai/core/streamObject.js +3 -3
- package/dist/ai/core/streamObject.js.map +1 -1
- package/dist/ai/core/types.d.ts +3 -0
- package/dist/ai/core/types.js.map +1 -1
- package/dist/ai/prompts.d.ts +1 -2
- package/dist/ai/prompts.js +0 -110
- package/dist/ai/prompts.js.map +1 -1
- package/dist/ai/providers/blocks/anthropic.js +2 -1
- package/dist/ai/providers/blocks/anthropic.js.map +1 -1
- package/dist/ai/providers/blocks/elevenlabs.js +3 -2
- package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
- package/dist/ai/providers/blocks/fal.js +2 -1
- package/dist/ai/providers/blocks/fal.js.map +1 -1
- package/dist/ai/providers/blocks/google.js +11 -6
- package/dist/ai/providers/blocks/google.js.map +1 -1
- package/dist/ai/providers/blocks/openai-compatible.js +2 -1
- package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
- package/dist/ai/providers/blocks/openai.js +3 -2
- package/dist/ai/providers/blocks/openai.js.map +1 -1
- package/dist/ai/providers/blocks/xai.js +2 -1
- package/dist/ai/providers/blocks/xai.js.map +1 -1
- package/dist/ai/providers/icons.d.ts +7 -0
- package/dist/ai/providers/icons.js +9 -0
- package/dist/ai/providers/icons.js.map +1 -0
- package/dist/ai/providers/registry.js +34 -24
- package/dist/ai/providers/registry.js.map +1 -1
- package/dist/ai/utils/filterEditorSchemaByNodes.d.ts +9 -0
- package/dist/ai/utils/filterEditorSchemaByNodes.js +30 -3
- package/dist/ai/utils/filterEditorSchemaByNodes.js.map +1 -1
- package/dist/ai/utils/nodeToSchemaMap.d.ts +22 -0
- package/dist/ai/utils/nodeToSchemaMap.js +72 -0
- package/dist/ai/utils/nodeToSchemaMap.js.map +1 -0
- package/dist/collections/AIJobs.js +1 -1
- package/dist/collections/AIJobs.js.map +1 -1
- package/dist/collections/AISettings.js +47 -20
- package/dist/collections/AISettings.js.map +1 -1
- package/dist/collections/Instructions.js +37 -0
- package/dist/collections/Instructions.js.map +1 -1
- package/dist/defaults.d.ts +1 -0
- package/dist/defaults.js +8 -0
- package/dist/defaults.js.map +1 -1
- package/dist/endpoints/chat.d.ts +4 -0
- package/dist/endpoints/fetchFields.js +10 -0
- package/dist/endpoints/fetchFields.js.map +1 -1
- package/dist/endpoints/fetchVoices.js +41 -24
- package/dist/endpoints/fetchVoices.js.map +1 -1
- package/dist/endpoints/index.js +194 -16
- package/dist/endpoints/index.js.map +1 -1
- package/dist/exports/fields.d.ts +1 -0
- package/dist/exports/fields.js +1 -0
- package/dist/exports/fields.js.map +1 -1
- package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
- package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
- package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
- package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
- package/dist/fields/PromptEditorField/PromptEditorField.js +7 -2
- package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
- package/dist/fields/PromptEditorField/PromptEditorField.jsx +5 -2
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/payload-ai.d.ts +152 -0
- package/dist/plugin.js +16 -32
- package/dist/plugin.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.js +47 -15
- package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
- package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +39 -16
- package/dist/providers/InstructionsProvider/context.d.ts +3 -0
- package/dist/providers/InstructionsProvider/context.js +2 -0
- package/dist/providers/InstructionsProvider/context.js.map +1 -1
- package/dist/providers/InstructionsProvider/useInstructions.js +21 -2
- package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
- package/dist/styles.d.ts +11 -0
- package/dist/types/handlebars-async-helpers.d.ts +1 -0
- package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
- package/dist/types/react-mentions.d.ts +1 -0
- package/dist/types.d.ts +34 -5
- package/dist/types.js +1 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/AIConfigDashboard/index.js +198 -22
- package/dist/ui/AIConfigDashboard/index.js.map +1 -1
- package/dist/ui/AIConfigDashboard/index.jsx +159 -13
- package/dist/ui/Compose/Compose.d.ts +1 -0
- package/dist/ui/Compose/Compose.js +23 -4
- package/dist/ui/Compose/Compose.js.map +1 -1
- package/dist/ui/Compose/Compose.jsx +23 -4
- package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
- package/dist/ui/Compose/UndoRedoActions.js +8 -5
- package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
- package/dist/ui/Compose/UndoRedoActions.jsx +6 -5
- package/dist/ui/Compose/compose.module.css +56 -16
- package/dist/ui/Compose/hooks/menu/itemsMap.js +12 -6
- package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.js +26 -15
- package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
- package/dist/ui/Compose/hooks/menu/useMenu.jsx +25 -12
- package/dist/ui/Compose/hooks/useGenerate.js +26 -174
- package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
- package/dist/ui/Compose/hooks/useGenerateUpload.d.ts +11 -0
- package/dist/ui/Compose/hooks/useGenerateUpload.js +150 -0
- package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -0
- package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
- package/dist/ui/Compose/hooks/useHistory.js +65 -25
- package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
- package/dist/ui/Compose/hooks/useStreamingUpdate.d.ts +8 -0
- package/dist/ui/Compose/hooks/useStreamingUpdate.js +48 -0
- package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -0
- package/dist/ui/DynamicVoiceSelect/index.js +63 -11
- package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
- package/dist/ui/DynamicVoiceSelect/index.jsx +47 -14
- package/dist/ui/EncryptedTextField/index.js +4 -4
- package/dist/ui/EncryptedTextField/index.js.map +1 -1
- package/dist/ui/EncryptedTextField/index.jsx +4 -4
- package/dist/ui/VoicesFetcher/index.js +34 -16
- package/dist/ui/VoicesFetcher/index.js.map +1 -1
- package/dist/ui/VoicesFetcher/index.jsx +32 -15
- package/dist/utilities/buildSmartPrompt.d.ts +22 -0
- package/dist/utilities/buildSmartPrompt.js +141 -0
- package/dist/utilities/buildSmartPrompt.js.map +1 -0
- package/dist/utilities/encryption.js +2 -1
- package/dist/utilities/encryption.js.map +1 -1
- package/dist/utilities/fieldToJsonSchema.js +32 -3
- package/dist/utilities/fieldToJsonSchema.js.map +1 -1
- package/dist/utilities/resolveImageReferences.d.ts +3 -1
- package/dist/utilities/resolveImageReferences.js +21 -2
- package/dist/utilities/resolveImageReferences.js.map +1 -1
- package/dist/utilities/seedProperties.d.ts +7 -0
- package/dist/utilities/seedProperties.js +100 -0
- package/dist/utilities/seedProperties.js.map +1 -0
- package/dist/utilities/setSafeLexicalState.js +79 -6
- package/dist/utilities/setSafeLexicalState.js.map +1 -1
- package/dist/utilities/updateFieldsConfig.d.ts +1 -1
- package/dist/utilities/updateFieldsConfig.js +8 -1
- package/dist/utilities/updateFieldsConfig.js.map +1 -1
- package/package.json +35 -33
- package/dist/endpoints/chat.d.js +0 -3
- package/dist/endpoints/chat.d.js.map +0 -1
- package/dist/init.d.ts +0 -7
- package/dist/init.js +0 -135
- package/dist/init.js.map +0 -1
- package/dist/payload-ai.d.js +0 -3
- package/dist/payload-ai.d.js.map +0 -1
- package/dist/styles.d.js +0 -2
- package/dist/styles.d.js.map +0 -1
- package/dist/types/handlebars-async-helpers.d.js +0 -2
- package/dist/types/handlebars-async-helpers.d.js.map +0 -1
- package/dist/types/handlebars-dist-handlebars.d.js +0 -2
- package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
- package/dist/types/react-mentions.d.js +0 -2
- package/dist/types/react-mentions.d.js.map +0 -1
|
@@ -1,24 +1,170 @@
|
|
|
1
1
|
'use client';
|
|
2
|
-
import
|
|
2
|
+
import { Button, toast, useConfig } from '@payloadcms/ui';
|
|
3
|
+
// @ts-expect-error - Next.js types are not resolving correctly with nodenext but runtime is fine
|
|
4
|
+
import { useRouter } from 'next/navigation';
|
|
5
|
+
import React, { useContext, useEffect, useState } from 'react';
|
|
6
|
+
import { excludeCollections } from '../../defaults.js';
|
|
7
|
+
import { InstructionsContext } from '../../providers/InstructionsProvider/context.js';
|
|
3
8
|
export const AIConfigDashboard = () => {
|
|
9
|
+
const { config: { collections, routes: { admin: adminRoute, api: apiRoute }, }, } = useConfig();
|
|
10
|
+
const router = useRouter();
|
|
11
|
+
const { refresh, setEnabledCollections: setEnabledCollectionsInContext } = useContext(InstructionsContext);
|
|
12
|
+
const [enabledCollections, setEnabledCollections] = useState([]);
|
|
13
|
+
const [isLoading, setIsLoading] = useState(true);
|
|
14
|
+
const [isSaving, setIsSaving] = useState(false);
|
|
15
|
+
const availableCollections = collections.filter((c) => !excludeCollections.includes(c.slug) &&
|
|
16
|
+
!c.admin?.hidden);
|
|
17
|
+
useEffect(() => {
|
|
18
|
+
const fetchSettings = async () => {
|
|
19
|
+
try {
|
|
20
|
+
const response = await fetch(`${apiRoute}/globals/ai-settings`);
|
|
21
|
+
if (response.ok) {
|
|
22
|
+
const data = await response.json();
|
|
23
|
+
// Handle both simple array and object wrapper if Payload wraps it
|
|
24
|
+
const storedEnabled = data.enabledCollections || [];
|
|
25
|
+
setEnabledCollections(Array.isArray(storedEnabled) ? storedEnabled : []);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch (error) {
|
|
29
|
+
console.error('Failed to fetch AI settings:', error);
|
|
30
|
+
}
|
|
31
|
+
finally {
|
|
32
|
+
setIsLoading(false);
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
fetchSettings().catch((e) => {
|
|
36
|
+
console.log(e);
|
|
37
|
+
});
|
|
38
|
+
}, [apiRoute]);
|
|
39
|
+
const handleToggle = (slug) => {
|
|
40
|
+
setEnabledCollections((prev) => {
|
|
41
|
+
if (prev.includes(slug)) {
|
|
42
|
+
return prev.filter((s) => s !== slug);
|
|
43
|
+
}
|
|
44
|
+
return [...prev, slug];
|
|
45
|
+
});
|
|
46
|
+
};
|
|
47
|
+
const handleSave = async () => {
|
|
48
|
+
setIsSaving(true);
|
|
49
|
+
try {
|
|
50
|
+
// First fetch current settings to get ID or just rely on global update behavior
|
|
51
|
+
// We need to adhere to Payload's global update API
|
|
52
|
+
const response = await fetch(`${apiRoute}/globals/ai-settings`, {
|
|
53
|
+
body: JSON.stringify({
|
|
54
|
+
enabledCollections,
|
|
55
|
+
}),
|
|
56
|
+
headers: {
|
|
57
|
+
'Content-Type': 'application/json',
|
|
58
|
+
},
|
|
59
|
+
method: 'POST',
|
|
60
|
+
});
|
|
61
|
+
if (response.ok) {
|
|
62
|
+
toast.success('Settings saved successfully');
|
|
63
|
+
if (setEnabledCollectionsInContext) {
|
|
64
|
+
setEnabledCollectionsInContext(enabledCollections);
|
|
65
|
+
}
|
|
66
|
+
if (refresh) {
|
|
67
|
+
await refresh();
|
|
68
|
+
}
|
|
69
|
+
router.refresh();
|
|
70
|
+
}
|
|
71
|
+
else {
|
|
72
|
+
toast.error('Failed to save settings');
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (error) {
|
|
76
|
+
console.error('Error saving settings:', error);
|
|
77
|
+
toast.error('Error saving settings');
|
|
78
|
+
}
|
|
79
|
+
finally {
|
|
80
|
+
setIsSaving(false);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
if (isLoading) {
|
|
84
|
+
return <div style={{ padding: '20px', textAlign: 'center' }}>Loading AI configuration...</div>;
|
|
85
|
+
}
|
|
4
86
|
return (<div style={{
|
|
5
|
-
alignItems: 'center',
|
|
6
87
|
background: 'var(--theme-elevation-50)',
|
|
7
|
-
border: '1px solid var(--theme-elevation-150)',
|
|
8
|
-
borderRadius: '8px',
|
|
88
|
+
// border: '1px solid var(--theme-elevation-150)',
|
|
89
|
+
// borderRadius: '8px',
|
|
90
|
+
marginBottom: '20px',
|
|
91
|
+
overflow: 'hidden',
|
|
92
|
+
}}>
|
|
93
|
+
<div style={{
|
|
94
|
+
alignItems: 'center',
|
|
95
|
+
borderBottom: '1px solid var(--theme-elevation-150)',
|
|
9
96
|
display: 'flex',
|
|
10
97
|
justifyContent: 'space-between',
|
|
11
|
-
marginBottom: '20px',
|
|
12
98
|
padding: '20px',
|
|
13
99
|
}}>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
100
|
+
<div>
|
|
101
|
+
<h4 style={{ margin: '0 0 5px 0' }}>AI Configuration</h4>
|
|
102
|
+
<p style={{ color: 'var(--theme-elevation-500)', fontSize: '14px', margin: '0' }}>
|
|
103
|
+
Manage your AI providers, API keys, and enable AI for specific collections.
|
|
104
|
+
</p>
|
|
105
|
+
</div>
|
|
106
|
+
<div style={{ display: 'flex', gap: '10px' }}>
|
|
107
|
+
<Button buttonStyle="secondary" el="link" to={`${adminRoute}/globals/ai-settings`}>
|
|
108
|
+
Settings
|
|
109
|
+
</Button>
|
|
110
|
+
<Button disabled={isSaving} onClick={handleSave}>
|
|
111
|
+
{isSaving ? 'Saving...' : 'Save Changes'}
|
|
112
|
+
</Button>
|
|
113
|
+
</div>
|
|
114
|
+
</div>
|
|
115
|
+
|
|
116
|
+
<div style={{ padding: '20px' }}>
|
|
117
|
+
<h5 style={{ marginBottom: '15px' }}>Enabled Collections</h5>
|
|
118
|
+
<div style={{
|
|
119
|
+
display: 'grid',
|
|
120
|
+
gap: '15px',
|
|
121
|
+
gridTemplateColumns: 'repeat(auto-fill, minmax(250px, 1fr))',
|
|
122
|
+
}}>
|
|
123
|
+
{availableCollections.map((collection) => {
|
|
124
|
+
const isEnabled = enabledCollections.includes(collection.slug);
|
|
125
|
+
return (<button key={collection.slug} onClick={() => handleToggle(collection.slug)} style={{
|
|
126
|
+
alignItems: 'center',
|
|
127
|
+
background: isEnabled
|
|
128
|
+
? 'var(--theme-elevation-100)'
|
|
129
|
+
: 'var(--theme-elevation-50)',
|
|
130
|
+
border: `1px solid ${isEnabled ? 'var(--theme-text-success)' : 'var(--theme-elevation-200)'}`,
|
|
131
|
+
borderRadius: '6px',
|
|
132
|
+
cursor: 'pointer',
|
|
133
|
+
display: 'flex',
|
|
134
|
+
gap: '10px',
|
|
135
|
+
padding: '10px 15px',
|
|
136
|
+
textAlign: 'left',
|
|
137
|
+
transition: 'all 0.2s ease',
|
|
138
|
+
width: '100%',
|
|
139
|
+
}} type="button">
|
|
140
|
+
<div style={{
|
|
141
|
+
alignItems: 'center',
|
|
142
|
+
background: isEnabled
|
|
143
|
+
? 'var(--theme-text-success)'
|
|
144
|
+
: 'var(--theme-elevation-200)',
|
|
145
|
+
borderRadius: '12px',
|
|
146
|
+
display: 'flex',
|
|
147
|
+
height: '24px',
|
|
148
|
+
justifyContent: isEnabled ? 'flex-end' : 'flex-start',
|
|
149
|
+
padding: '2px',
|
|
150
|
+
transition: 'all 0.2s ease',
|
|
151
|
+
width: '44px',
|
|
152
|
+
}}>
|
|
153
|
+
<div style={{
|
|
154
|
+
background: 'white',
|
|
155
|
+
borderRadius: '50%',
|
|
156
|
+
height: '20px',
|
|
157
|
+
width: '20px',
|
|
158
|
+
}}/>
|
|
159
|
+
</div>
|
|
160
|
+
<span style={{ fontWeight: 500 }}>
|
|
161
|
+
{typeof collection.labels?.singular === 'string'
|
|
162
|
+
? collection.labels.singular
|
|
163
|
+
: collection.labels?.singular?.en || collection.slug}
|
|
164
|
+
</span>
|
|
165
|
+
</button>);
|
|
166
|
+
})}
|
|
167
|
+
</div>
|
|
19
168
|
</div>
|
|
20
|
-
<a href="/admin/globals/ai-settings">
|
|
21
|
-
<button className="btn btn--style-primary btn--size-small">Manage AI Settings</button>
|
|
22
|
-
</a>
|
|
23
169
|
</div>);
|
|
24
170
|
};
|
|
@@ -11,7 +11,7 @@ import { useMenu } from './hooks/menu/useMenu.js';
|
|
|
11
11
|
import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
|
|
12
12
|
import { useGenerate } from './hooks/useGenerate.js';
|
|
13
13
|
import { UndoRedoActions } from './UndoRedoActions.js';
|
|
14
|
-
export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
|
|
14
|
+
export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed })=>{
|
|
15
15
|
const pathFromContext = descriptionProps?.path;
|
|
16
16
|
const { editor: lexicalEditor } = useEditorConfigContext();
|
|
17
17
|
// Get global openDrawer from context
|
|
@@ -134,9 +134,28 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
|
|
|
134
134
|
path: pathFromContext
|
|
135
135
|
});
|
|
136
136
|
const setIfValueIsLexicalState = useCallback((val)=>{
|
|
137
|
-
|
|
138
|
-
|
|
137
|
+
// Prevent setting incomplete states during streaming
|
|
138
|
+
if (!val || typeof val !== 'object' || !('root' in val) || !lexicalEditor) {
|
|
139
|
+
return;
|
|
139
140
|
}
|
|
141
|
+
// Validate that the state is complete before setting
|
|
142
|
+
// Check for common incomplete streaming states
|
|
143
|
+
if (!val.root || typeof val.root !== 'object' || Object.keys(val.root).length === 0) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (val.root.type !== 'root') {
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (!val.root.children || !Array.isArray(val.root.children) || val.root.children.length === 0) {
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
// Check for invalid child types (common streaming issue)
|
|
153
|
+
const hasInvalidChildren = val.root.children.some((child)=>!child || !child.type || child.type === 'undefined' || child.type === '');
|
|
154
|
+
if (hasInvalidChildren) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
// State looks valid, proceed
|
|
158
|
+
setSafeLexicalState(JSON.stringify(val), lexicalEditor);
|
|
140
159
|
// DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
|
|
141
160
|
}, []);
|
|
142
161
|
const popupRender = useCallback(({ close })=>{
|
|
@@ -164,7 +183,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
|
|
|
164
183
|
isAnyLoading
|
|
165
184
|
]);
|
|
166
185
|
return /*#__PURE__*/ _jsxs("label", {
|
|
167
|
-
className: `payloadai-compose__actions ${styles.actions}`,
|
|
186
|
+
className: `payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`,
|
|
168
187
|
onClick: (e)=>e.preventDefault(),
|
|
169
188
|
role: "presentation",
|
|
170
189
|
children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { Popup, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js'\nimport { useGenerate } from './hooks/useGenerate.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\n\nexport type ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n instructionId: string\n isConfigAllowed: boolean\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, instructionId, isConfigAllowed }) => {\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n \n // Get global openDrawer from context\n const { openDrawer } = useInstructions()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId })\n\n // Memoize menu event handlers to prevent recreation on every render\n const onCompose = useCallback(() => {\n console.log('Composing...')\n setIsProcessing(true)\n generate({\n action: 'Compose',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onExpand = useCallback(() => {\n console.log('Expanding...')\n generate({\n action: 'Expand',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onProofread = useCallback(() => {\n console.log('Proofreading...')\n generate({\n action: 'Proofread',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onRephrase = useCallback(() => {\n console.log('Rephrasing...')\n generate({\n action: 'Rephrase',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSimplify = useCallback(() => {\n console.log('Simplifying...')\n generate({\n action: 'Simplify',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSummarize = useCallback(() => {\n console.log('Summarizing...')\n generate({\n action: 'Summarize',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onTranslate = useCallback((data: unknown) => {\n console.log('Translating...')\n generate({\n action: 'Translate',\n params: data,\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const handleOpenSettings = useCallback(() => {\n if (isConfigAllowed) {\n openDrawer(instructionId)\n }\n }, [isConfigAllowed, openDrawer, instructionId])\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose,\n onExpand,\n onProofread,\n onRephrase,\n onSettings: isConfigAllowed ? handleOpenSettings : undefined,\n onSimplify,\n onSummarize,\n onTranslate,\n },\n {\n isConfigAllowed,\n },\n )\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit\n }, [])\n\n const popupRender = useCallback(\n ({ close }: { close: () => void }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n // Combine loading states to reduce re-renders\n const isAnyLoading = isProcessing || isLoading || isJobActive\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isAnyLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isAnyLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n {memoizedPopup}\n <ActiveComponent\n isLoading={isProcessing || isLoading || isJobActive}\n loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined}\n stop={stop}\n />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useField","React","useCallback","useMemo","useState","useInstructions","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","instructionId","isConfigAllowed","pathFromContext","path","editor","lexicalEditor","openDrawer","isProcessing","setIsProcessing","generate","isJobActive","isLoading","jobProgress","jobStatus","stop","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSimplify","onSummarize","onTranslate","data","params","handleOpenSettings","ActiveComponent","Menu","onSettings","undefined","setValue","setIfValueIsLexicalState","val","JSON","stringify","popupRender","close","onClose","isAnyLoading","memoizedPopup","button","render","verticalAlign","label","className","actions","onClick","e","preventDefault","role","loadingLabel","Math","max","min","round","onChange"],"mappings":"AAAA;;AAKA,SAASA,sBAAsB,QAAQ,sCAAqC;AAC5E,SAASC,KAAK,EAAEC,QAAQ,QAAQ,iBAAgB;AAChD,OAAOC,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAG7D,SAASC,eAAe,QAAQ,0DAAyD;AACzF,SAASC,mBAAmB,QAAQ,yCAAwC;AAC5E,SAASC,UAAU,QAAQ,oBAAmB;AAC9C,OAAOC,YAAY,uBAAsB;AACzC,SAASC,OAAO,QAAQ,0BAAyB;AACjD,SAASC,sBAAsB,QAAQ,oCAAmC;AAC1E,SAASC,WAAW,QAAQ,yBAAwB;AACpD,SAASC,eAAe,QAAQ,uBAAsB;AAYtD,OAAO,MAAMC,UAA4B,CAAC,EAAEC,gBAAgB,EAAEC,aAAa,EAAEC,eAAe,EAAE;IAC5F,MAAMC,kBAAkBH,kBAAkBI;IAC1C,MAAM,EAAEC,QAAQC,aAAa,EAAE,GAAGtB;IAElC,qCAAqC;IACrC,MAAM,EAAEuB,UAAU,EAAE,GAAGhB;IAEvB,0CAA0C;IAC1CK;IAEA,MAAM,CAACY,cAAcC,gBAAgB,GAAGnB,SAAkB;IAC1D,MAAM,EAAEoB,QAAQ,EAAEC,WAAW,EAAEC,SAAS,EAAEC,WAAW,EAAEC,SAAS,EAAEC,IAAI,EAAE,GAAGlB,YAAY;QAAEI;IAAc;IAEvG,oEAAoE;IACpE,MAAMe,YAAY5B,YAAY;QAC5B6B,QAAQC,GAAG,CAAC;QACZT,gBAAgB;QAChBC,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMc,WAAWpC,YAAY;QAC3B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMe,cAAcrC,YAAY;QAC9B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMgB,aAAatC,YAAY;QAC7B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMiB,aAAavC,YAAY;QAC7B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMkB,cAAcxC,YAAY;QAC9B6B,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;QACV,GACGC,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMmB,cAAczC,YAAY,CAAC0C;QAC/Bb,QAAQC,GAAG,CAAC;QACZR,SAAS;YACPS,QAAQ;YACRY,QAAQD;QACV,GACGV,KAAK,CAAC,CAACC;YACNJ,QAAQK,KAAK,CAAC,cAAcD;QAC9B,GACCE,OAAO,CAAC;YACPd,gBAAgB;QAClB;IACJ,GAAG;QAACC;KAAS;IAEb,MAAMsB,qBAAqB5C,YAAY;QACrC,IAAIc,iBAAiB;YACnBK,WAAWN;QACb;IACF,GAAG;QAACC;QAAiBK;QAAYN;KAAc;IAE/C,MAAM,EAAEgC,eAAe,EAAEC,IAAI,EAAE,GAAGvC,QAChC;QACEqB;QACAQ;QACAC;QACAC;QACAS,YAAYjC,kBAAkB8B,qBAAqBI;QACnDT;QACAC;QACAC;IACF,GACA;QACE3B;IACF;IAGF,MAAM,EAAEmC,QAAQ,EAAE,GAAGnD,SAAiB;QACpCkB,MAAMD;IACR;IAEA,MAAMmC,2BAA2BlD,YAAY,CAACmD;QAC5C,IAAIA,OAAO,OAAOA,QAAQ,YAAY,UAAUA,OAAOjC,eAAe;YACpEd,oBAAoBgD,KAAKC,SAAS,CAACF,MAAMjC;QAC3C;IAEA,6HAA6H;IAC/H,GAAG,EAAE;IAEL,MAAMoC,cAActD,YAClB,CAAC,EAAEuD,KAAK,EAAyB;QAC/B,qBAAO,KAACT;YAAKtB,WAAWJ,gBAAgBI;YAAWgC,SAASD;;IAC9D,GACA;QAACnC;QAAcI;QAAWsB;KAAK;IAGjC,8CAA8C;IAC9C,MAAMW,eAAerC,gBAAgBI,aAAaD;IAElD,MAAMmC,gBAAgBzD,QAAQ;QAC5B,qBACE,KAACJ;YACC8D,sBAAQ,KAACtD;gBAAWmB,WAAWiC;;YAC/BG,QAAQN;YACRO,eAAc;;IAGpB,GAAG;QAACP;QAAaG;KAAa;IAE9B,qBACE,MAACK;QACCC,WAAW,CAAC,2BAA2B,EAAEzD,OAAO0D,OAAO,CAAC,CAAC;QACzDC,SAAS,CAACC,IAAMA,EAAEC,cAAc;QAChCC,MAAK;;YAEJV;0BACD,KAACb;gBACCrB,WAAWJ,gBAAgBI,aAAaD;gBACxC8C,cAAc9C,cAAeG,cAAc,YAAY,CAAC,MAAM,EAAE4C,KAAKC,GAAG,CAAC,GAAGD,KAAKE,GAAG,CAAC,KAAKF,KAAKG,KAAK,CAAChD,eAAe,KAAK,CAAC,CAAC,GAAIC,aAAa,WAAasB;gBACzJrB,MAAMA;;0BAER,KAACjB;gBACCgE,UAAU,CAACvB;oBACTF,SAASE;oBACTD,yBAAyBC;gBAC3B;;;;AAIR,EAAC"}
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { ClientField } from 'payload'\nimport type { FC } from 'react'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { Popup, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport styles from './compose.module.css'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js'\nimport { useGenerate } from './hooks/useGenerate.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\n\nexport type ComposeProps = {\n descriptionProps?: {\n field: ClientField\n path: string\n schemaPath: string\n }\n forceVisible?: boolean\n instructionId: string\n isConfigAllowed: boolean\n}\n\nexport const Compose: FC<ComposeProps> = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n \n // Get global openDrawer from context\n const { openDrawer } = useInstructions()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId })\n\n // Memoize menu event handlers to prevent recreation on every render\n const onCompose = useCallback(() => {\n console.log('Composing...')\n setIsProcessing(true)\n generate({\n action: 'Compose',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onExpand = useCallback(() => {\n console.log('Expanding...')\n generate({\n action: 'Expand',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onProofread = useCallback(() => {\n console.log('Proofreading...')\n generate({\n action: 'Proofread',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onRephrase = useCallback(() => {\n console.log('Rephrasing...')\n generate({\n action: 'Rephrase',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSimplify = useCallback(() => {\n console.log('Simplifying...')\n generate({\n action: 'Simplify',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onSummarize = useCallback(() => {\n console.log('Summarizing...')\n generate({\n action: 'Summarize',\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const onTranslate = useCallback((data: unknown) => {\n console.log('Translating...')\n generate({\n action: 'Translate',\n params: data,\n })\n .catch((reason) => {\n console.error('Compose : ', reason)\n })\n .finally(() => {\n setIsProcessing(false)\n })\n }, [generate])\n\n const handleOpenSettings = useCallback(() => {\n if (isConfigAllowed) {\n openDrawer(instructionId)\n }\n }, [isConfigAllowed, openDrawer, instructionId])\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose,\n onExpand,\n onProofread,\n onRephrase,\n onSettings: isConfigAllowed ? handleOpenSettings : undefined,\n onSimplify,\n onSummarize,\n onTranslate,\n },\n {\n isConfigAllowed,\n },\n )\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n // Prevent setting incomplete states during streaming\n if (!val || typeof val !== 'object' || !('root' in val) || !lexicalEditor) {\n return\n }\n\n // Validate that the state is complete before setting\n // Check for common incomplete streaming states\n if (!val.root || typeof val.root !== 'object' || Object.keys(val.root).length === 0) {\n return\n }\n\n if (val.root.type !== 'root') {\n return\n }\n\n if (!val.root.children || !Array.isArray(val.root.children) || val.root.children.length === 0) {\n return\n }\n\n // Check for invalid child types (common streaming issue)\n const hasInvalidChildren = val.root.children.some(\n (child: any) => !child || !child.type || child.type === 'undefined' || child.type === '',\n )\n\n if (hasInvalidChildren) {\n return\n }\n\n // State looks valid, proceed\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit\n }, [])\n\n const popupRender = useCallback(\n ({ close }: { close: () => void }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n },\n [isProcessing, isLoading, Menu],\n )\n\n // Combine loading states to reduce re-renders\n const isAnyLoading = isProcessing || isLoading || isJobActive\n\n const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isAnyLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isAnyLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n {memoizedPopup}\n <ActiveComponent\n isLoading={isProcessing || isLoading || isJobActive}\n loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined}\n stop={stop}\n />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useField","React","useCallback","useMemo","useState","useInstructions","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","forceVisible","instructionId","isConfigAllowed","pathFromContext","path","editor","lexicalEditor","openDrawer","isProcessing","setIsProcessing","generate","isJobActive","isLoading","jobProgress","jobStatus","stop","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSimplify","onSummarize","onTranslate","data","params","handleOpenSettings","ActiveComponent","Menu","onSettings","undefined","setValue","setIfValueIsLexicalState","val","root","Object","keys","length","type","children","Array","isArray","hasInvalidChildren","some","child","JSON","stringify","popupRender","close","onClose","isAnyLoading","memoizedPopup","button","render","verticalAlign","label","className","actions","actionsVisible","onClick","e","preventDefault","role","loadingLabel","Math","max","min","round","onChange"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ import { useMenu } from './hooks/menu/useMenu.js';
|
|
|
10
10
|
import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
|
|
11
11
|
import { useGenerate } from './hooks/useGenerate.js';
|
|
12
12
|
import { UndoRedoActions } from './UndoRedoActions.js';
|
|
13
|
-
export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) => {
|
|
13
|
+
export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {
|
|
14
14
|
const pathFromContext = descriptionProps?.path;
|
|
15
15
|
const { editor: lexicalEditor } = useEditorConfigContext();
|
|
16
16
|
// Get global openDrawer from context
|
|
@@ -127,9 +127,28 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
|
|
|
127
127
|
path: pathFromContext,
|
|
128
128
|
});
|
|
129
129
|
const setIfValueIsLexicalState = useCallback((val) => {
|
|
130
|
-
|
|
131
|
-
|
|
130
|
+
// Prevent setting incomplete states during streaming
|
|
131
|
+
if (!val || typeof val !== 'object' || !('root' in val) || !lexicalEditor) {
|
|
132
|
+
return;
|
|
132
133
|
}
|
|
134
|
+
// Validate that the state is complete before setting
|
|
135
|
+
// Check for common incomplete streaming states
|
|
136
|
+
if (!val.root || typeof val.root !== 'object' || Object.keys(val.root).length === 0) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
if (val.root.type !== 'root') {
|
|
140
|
+
return;
|
|
141
|
+
}
|
|
142
|
+
if (!val.root.children || !Array.isArray(val.root.children) || val.root.children.length === 0) {
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
// Check for invalid child types (common streaming issue)
|
|
146
|
+
const hasInvalidChildren = val.root.children.some((child) => !child || !child.type || child.type === 'undefined' || child.type === '');
|
|
147
|
+
if (hasInvalidChildren) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
// State looks valid, proceed
|
|
151
|
+
setSafeLexicalState(JSON.stringify(val), lexicalEditor);
|
|
133
152
|
// DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
|
|
134
153
|
}, []);
|
|
135
154
|
const popupRender = useCallback(({ close }) => {
|
|
@@ -140,7 +159,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
|
|
|
140
159
|
const memoizedPopup = useMemo(() => {
|
|
141
160
|
return (<Popup button={<PluginIcon isLoading={isAnyLoading}/>} render={popupRender} verticalAlign="bottom"/>);
|
|
142
161
|
}, [popupRender, isAnyLoading]);
|
|
143
|
-
return (<label className={`payloadai-compose__actions ${styles.actions}`} onClick={(e) => e.preventDefault()} role="presentation">
|
|
162
|
+
return (<label className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`} onClick={(e) => e.preventDefault()} role="presentation">
|
|
144
163
|
{memoizedPopup}
|
|
145
164
|
<ActiveComponent isLoading={isProcessing || isLoading || isJobActive} loadingLabel={isJobActive ? (jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : (jobStatus || 'Queued')) : undefined} stop={stop}/>
|
|
146
165
|
<UndoRedoActions onChange={(val) => {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
export declare const UndoRedoActions: ({ onChange }: {
|
|
2
|
+
export declare const UndoRedoActions: React.MemoExoticComponent<({ onChange }: {
|
|
3
3
|
onChange: (val: unknown) => void;
|
|
4
|
-
}) => React.JSX.Element | null
|
|
4
|
+
}) => React.JSX.Element | null>;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import React, { useCallback, useEffect, useState } from 'react';
|
|
2
|
+
import React, { memo, useCallback, useEffect, useState } from 'react';
|
|
3
3
|
import { useHistory } from './hooks/useHistory.js';
|
|
4
|
-
export const UndoRedoActions = ({ onChange })=>{
|
|
4
|
+
export const UndoRedoActions = /*#__PURE__*/ memo(({ onChange })=>{
|
|
5
5
|
const { canRedo, canUndo, redo, undo } = useHistory();
|
|
6
6
|
const redoHistoryValue = useCallback((event)=>{
|
|
7
7
|
event.stopPropagation();
|
|
@@ -10,7 +10,8 @@ export const UndoRedoActions = ({ onChange })=>{
|
|
|
10
10
|
onChange(value);
|
|
11
11
|
}
|
|
12
12
|
}, [
|
|
13
|
-
redo
|
|
13
|
+
redo,
|
|
14
|
+
onChange
|
|
14
15
|
]);
|
|
15
16
|
const undoHistoryValue = useCallback((event)=>{
|
|
16
17
|
event.stopPropagation();
|
|
@@ -19,7 +20,8 @@ export const UndoRedoActions = ({ onChange })=>{
|
|
|
19
20
|
onChange(value);
|
|
20
21
|
}
|
|
21
22
|
}, [
|
|
22
|
-
undo
|
|
23
|
+
undo,
|
|
24
|
+
onChange
|
|
23
25
|
]);
|
|
24
26
|
// Delay rendering until the client-side hydration is complete
|
|
25
27
|
const [isMounted, setIsMounted] = useState(false);
|
|
@@ -53,6 +55,7 @@ export const UndoRedoActions = ({ onChange })=>{
|
|
|
53
55
|
})
|
|
54
56
|
]
|
|
55
57
|
});
|
|
56
|
-
};
|
|
58
|
+
});
|
|
59
|
+
UndoRedoActions.displayName = 'UndoRedoActions';
|
|
57
60
|
|
|
58
61
|
//# sourceMappingURL=UndoRedoActions.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler} from 'react'
|
|
1
|
+
{"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import type { MouseEventHandler } from 'react'\n\nimport React, { memo, useCallback, useEffect, useState } from 'react'\n\nimport { useHistory } from './hooks/useHistory.js'\n\nexport const UndoRedoActions = memo(({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo, onChange],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo, onChange],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) {\n return null\n }\n\n return (\n <React.Fragment>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n disabled={!canUndo}\n onClick={undoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Undo\n </button>\n <button\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n disabled={!canRedo}\n onClick={redoHistoryValue}\n style={{ marginBlock: 0 }}\n type=\"button\"\n >\n Redo\n </button>\n </React.Fragment>\n )\n})\n\nUndoRedoActions.displayName = 'UndoRedoActions'\n"],"names":["React","memo","useCallback","useEffect","useState","useHistory","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","Fragment","button","className","disabled","onClick","style","marginBlock","type","displayName"],"mappings":";AAEA,OAAOA,SAASC,IAAI,EAAEC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAErE,SAASC,UAAU,QAAQ,wBAAuB;AAElD,OAAO,MAAMC,gCAAkBL,KAAK,CAAC,EAAEM,QAAQ,EAAwC;IACrF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGN;IAEzC,MAAMO,mBAAmBV,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;QAAMH;KAAS;IAGlB,MAAMS,mBAAmBd,YACvB,CAACW;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;QAAMJ;KAAS;IAGlB,8DAA8D;IAC9D,MAAM,CAACU,WAAWC,aAAa,GAAGd,SAAS;IAE3CD,UAAU;QACRe,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU;QACxC,OAAO;IACT;IAEA,qBACE,MAACR,MAAMmB,QAAQ;;0BACb,KAACC;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACZ,WAAW,gBAAgB,CAAC;gBACpFa,UAAU,CAACb;gBACXc,SAASP;gBACTQ,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;0BAGD,KAACN;gBACCC,WAAW,CAAC,yCAAyC,EAAE,CAACb,WAAW,gBAAgB,CAAC;gBACpFc,UAAU,CAACd;gBACXe,SAASX;gBACTY,OAAO;oBAAEC,aAAa;gBAAE;gBACxBC,MAAK;0BACN;;;;AAKP,GAAE;AAEFpB,gBAAgBqB,WAAW,GAAG"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React, { useCallback, useEffect, useState } from 'react';
|
|
1
|
+
import React, { memo, useCallback, useEffect, useState } from 'react';
|
|
2
2
|
import { useHistory } from './hooks/useHistory.js';
|
|
3
|
-
export const UndoRedoActions = ({ onChange }) => {
|
|
3
|
+
export const UndoRedoActions = memo(({ onChange }) => {
|
|
4
4
|
const { canRedo, canUndo, redo, undo } = useHistory();
|
|
5
5
|
const redoHistoryValue = useCallback((event) => {
|
|
6
6
|
event.stopPropagation();
|
|
@@ -8,14 +8,14 @@ export const UndoRedoActions = ({ onChange }) => {
|
|
|
8
8
|
if (value) {
|
|
9
9
|
onChange(value);
|
|
10
10
|
}
|
|
11
|
-
}, [redo]);
|
|
11
|
+
}, [redo, onChange]);
|
|
12
12
|
const undoHistoryValue = useCallback((event) => {
|
|
13
13
|
event.stopPropagation();
|
|
14
14
|
const value = undo();
|
|
15
15
|
if (value) {
|
|
16
16
|
onChange(value);
|
|
17
17
|
}
|
|
18
|
-
}, [undo]);
|
|
18
|
+
}, [undo, onChange]);
|
|
19
19
|
// Delay rendering until the client-side hydration is complete
|
|
20
20
|
const [isMounted, setIsMounted] = useState(false);
|
|
21
21
|
useEffect(() => {
|
|
@@ -32,4 +32,5 @@ export const UndoRedoActions = ({ onChange }) => {
|
|
|
32
32
|
Redo
|
|
33
33
|
</button>
|
|
34
34
|
</React.Fragment>);
|
|
35
|
-
};
|
|
35
|
+
});
|
|
36
|
+
UndoRedoActions.displayName = 'UndoRedoActions';
|
|
@@ -13,10 +13,6 @@
|
|
|
13
13
|
transform-origin: top;
|
|
14
14
|
max-height: 0;
|
|
15
15
|
|
|
16
|
-
will-change: transform, opacity;
|
|
17
|
-
backface-visibility: hidden;
|
|
18
|
-
perspective: 1000px;
|
|
19
|
-
|
|
20
16
|
transition:
|
|
21
17
|
opacity 0.25s cubic-bezier(0.4, 0, 0.2, 1),
|
|
22
18
|
transform 0.3s cubic-bezier(0.4, 0, 0.2, 1),
|
|
@@ -39,23 +35,22 @@
|
|
|
39
35
|
max-height 0.3s cubic-bezier(0.4, 0, 0.2, 1);
|
|
40
36
|
}
|
|
41
37
|
|
|
38
|
+
|
|
39
|
+
|
|
42
40
|
:global(.field-type.ai-plugin-active) .actions {
|
|
43
|
-
animation: removeWillChange 0.3s forwards;
|
|
41
|
+
/* animation: removeWillChange 0.3s forwards; */
|
|
44
42
|
}
|
|
45
43
|
|
|
46
|
-
@keyframes removeWillChange {
|
|
44
|
+
/* @keyframes removeWillChange {
|
|
47
45
|
to {
|
|
48
46
|
will-change: auto;
|
|
49
47
|
}
|
|
50
|
-
}
|
|
48
|
+
} */
|
|
51
49
|
|
|
52
50
|
.actions > * {
|
|
53
51
|
opacity: 0;
|
|
54
52
|
transform: translateY(-3px) translateZ(0);
|
|
55
53
|
|
|
56
|
-
will-change: transform, opacity;
|
|
57
|
-
backface-visibility: hidden;
|
|
58
|
-
|
|
59
54
|
transition:
|
|
60
55
|
opacity 0.2s cubic-bezier(0.4, 0, 0.2, 1),
|
|
61
56
|
transform 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
@@ -68,27 +63,22 @@
|
|
|
68
63
|
|
|
69
64
|
:global(.field-type.ai-plugin-active) .actions > *:nth-child(1) {
|
|
70
65
|
transition-delay: 0.05s;
|
|
71
|
-
animation: removeWillChange 0.25s 0.05s forwards;
|
|
72
66
|
}
|
|
73
67
|
|
|
74
68
|
:global(.field-type.ai-plugin-active) .actions > *:nth-child(2) {
|
|
75
69
|
transition-delay: 0.08s;
|
|
76
|
-
animation: removeWillChange 0.28s 0.08s forwards;
|
|
77
70
|
}
|
|
78
71
|
|
|
79
72
|
:global(.field-type.ai-plugin-active) .actions > *:nth-child(3) {
|
|
80
73
|
transition-delay: 0.11s;
|
|
81
|
-
animation: removeWillChange 0.31s 0.11s forwards;
|
|
82
74
|
}
|
|
83
75
|
|
|
84
76
|
:global(.field-type.ai-plugin-active) .actions > *:nth-child(4) {
|
|
85
77
|
transition-delay: 0.14s;
|
|
86
|
-
animation: removeWillChange 0.34s 0.14s forwards;
|
|
87
78
|
}
|
|
88
79
|
|
|
89
80
|
:global(.field-type.ai-plugin-active) .actions > *:nth-child(5) {
|
|
90
81
|
transition-delay: 0.17s;
|
|
91
|
-
animation: removeWillChange 0.37s 0.17s forwards;
|
|
92
82
|
}
|
|
93
83
|
|
|
94
84
|
@media (prefers-reduced-motion: no-preference) and (min-resolution: 120dpi) {
|
|
@@ -103,6 +93,56 @@
|
|
|
103
93
|
.actions > * {
|
|
104
94
|
transition-duration: 0.01ms !important;
|
|
105
95
|
animation-duration: 0.01ms !important;
|
|
106
|
-
will-change: auto !important;
|
|
107
96
|
}
|
|
108
97
|
}
|
|
98
|
+
|
|
99
|
+
/* Force visibility modifier - Placed at end for CSS priority */
|
|
100
|
+
.actions.actionsVisible {
|
|
101
|
+
opacity: 1;
|
|
102
|
+
visibility: visible;
|
|
103
|
+
pointer-events: auto;
|
|
104
|
+
max-height: 100px;
|
|
105
|
+
transform: scaleY(1) skewX(0) translateY(0) translateZ(0);
|
|
106
|
+
|
|
107
|
+
/* User requested overrides */
|
|
108
|
+
margin: 0;
|
|
109
|
+
padding: 0;
|
|
110
|
+
/* flex-direction: row-reverse; - Reverted */
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.actions.actionsVisible > * {
|
|
114
|
+
opacity: 1;
|
|
115
|
+
transform: translateY(0) translateZ(0);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/* Ensure field wrapper is positioned for absolute children */
|
|
119
|
+
/* Ensure field wrapper is positioned for absolute children */
|
|
120
|
+
.arrayFieldWrapper {
|
|
121
|
+
position: relative !important;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/* Position Compose button - Base */
|
|
125
|
+
.composePortal {
|
|
126
|
+
display: flex !important;
|
|
127
|
+
align-items: center;
|
|
128
|
+
height: min-content;
|
|
129
|
+
z-index: 5;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/* When Add Row is present: Overlay at bottom right */
|
|
133
|
+
.composePortalAbsolute {
|
|
134
|
+
position: absolute;
|
|
135
|
+
bottom: 0;
|
|
136
|
+
right: 0;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/* When Add Row is missing: Normal flow at bottom right */
|
|
140
|
+
.composePortalStatic {
|
|
141
|
+
position: relative;
|
|
142
|
+
width: 100%;
|
|
143
|
+
justify-content: flex-end;
|
|
144
|
+
margin-top: -32px;
|
|
145
|
+
/* Reset absolute positioning styles */
|
|
146
|
+
bottom: auto;
|
|
147
|
+
right: auto;
|
|
148
|
+
}
|
|
@@ -5,7 +5,8 @@ export const menuItemsMap = [
|
|
|
5
5
|
name: 'Proofread',
|
|
6
6
|
component: Proofread,
|
|
7
7
|
excludedFor: [
|
|
8
|
-
'upload'
|
|
8
|
+
'upload',
|
|
9
|
+
'array'
|
|
9
10
|
],
|
|
10
11
|
loadingText: 'Proofreading'
|
|
11
12
|
},
|
|
@@ -13,7 +14,8 @@ export const menuItemsMap = [
|
|
|
13
14
|
name: 'Rephrase',
|
|
14
15
|
component: Rephrase,
|
|
15
16
|
excludedFor: [
|
|
16
|
-
'upload'
|
|
17
|
+
'upload',
|
|
18
|
+
'array'
|
|
17
19
|
],
|
|
18
20
|
loadingText: 'Rephrasing'
|
|
19
21
|
},
|
|
@@ -21,7 +23,8 @@ export const menuItemsMap = [
|
|
|
21
23
|
name: 'Translate',
|
|
22
24
|
component: MemoizedTranslateMenu,
|
|
23
25
|
excludedFor: [
|
|
24
|
-
'upload'
|
|
26
|
+
'upload',
|
|
27
|
+
'array'
|
|
25
28
|
],
|
|
26
29
|
loadingText: 'Translating'
|
|
27
30
|
},
|
|
@@ -30,7 +33,8 @@ export const menuItemsMap = [
|
|
|
30
33
|
component: Expand,
|
|
31
34
|
excludedFor: [
|
|
32
35
|
'upload',
|
|
33
|
-
'text'
|
|
36
|
+
'text',
|
|
37
|
+
'array'
|
|
34
38
|
],
|
|
35
39
|
loadingText: 'Expanding'
|
|
36
40
|
},
|
|
@@ -41,7 +45,8 @@ export const menuItemsMap = [
|
|
|
41
45
|
excludedFor: [
|
|
42
46
|
'upload',
|
|
43
47
|
'text',
|
|
44
|
-
'richText'
|
|
48
|
+
'richText',
|
|
49
|
+
'array'
|
|
45
50
|
],
|
|
46
51
|
loadingText: 'Summarizing'
|
|
47
52
|
},
|
|
@@ -49,7 +54,8 @@ export const menuItemsMap = [
|
|
|
49
54
|
name: 'Simplify',
|
|
50
55
|
component: Simplify,
|
|
51
56
|
excludedFor: [
|
|
52
|
-
'upload'
|
|
57
|
+
'upload',
|
|
58
|
+
'array'
|
|
53
59
|
],
|
|
54
60
|
loadingText: 'Simplifying'
|
|
55
61
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","MemoizedTranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,qBAAqB,QAAuB,qBAAoB;AASzE,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;
|
|
1
|
+
{"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import type React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { MemoizedTranslateMenu, TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload', 'array'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload', 'array'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: MemoizedTranslateMenu,\n excludedFor: ['upload', 'array'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text', 'array'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText', 'array'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload', 'array'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","MemoizedTranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAIA,SAASA,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,qBAAqB,QAAuB,qBAAoB;AASzE,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAe;IACzG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAa;IACrG;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;YAAU;SAAQ;QAChCC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;YAAQ;SAAQ;QAAEC,aAAa;IAAY;IACxG;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;YAAY;SAAQ;QACpDC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;YAAU;SAAQ;QAAEC,aAAa;IAAc;IACtG;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}
|