@ai-stack/payloadcms 3.2.24-beta → 3.68.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.
Files changed (284) hide show
  1. package/{LICENSE.md → LICENSE} +1 -1
  2. package/README.md +218 -229
  3. package/dist/access/checkAccess.d.ts +4 -0
  4. package/dist/access/checkAccess.js +20 -0
  5. package/dist/access/checkAccess.js.map +1 -0
  6. package/dist/ai/core/generateObject.d.ts +7 -0
  7. package/dist/ai/core/generateObject.js +35 -0
  8. package/dist/ai/core/generateObject.js.map +1 -0
  9. package/dist/ai/core/generateText.d.ts +7 -0
  10. package/dist/ai/core/generateText.js +31 -0
  11. package/dist/ai/core/generateText.js.map +1 -0
  12. package/dist/ai/core/index.d.ts +11 -0
  13. package/dist/ai/core/index.js +10 -0
  14. package/dist/ai/core/index.js.map +1 -0
  15. package/dist/ai/core/media/generateMedia.d.ts +7 -0
  16. package/dist/ai/core/media/generateMedia.js +50 -0
  17. package/dist/ai/core/media/generateMedia.js.map +1 -0
  18. package/dist/ai/core/media/image/generateImage.d.ts +6 -0
  19. package/dist/ai/core/media/image/generateImage.js +41 -0
  20. package/dist/ai/core/media/image/generateImage.js.map +1 -0
  21. package/dist/ai/core/media/image/handlers/multimodal.d.ts +7 -0
  22. package/dist/ai/core/media/image/handlers/multimodal.js +95 -0
  23. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -0
  24. package/dist/ai/core/media/image/handlers/standard.d.ts +7 -0
  25. package/dist/ai/core/media/image/handlers/standard.js +28 -0
  26. package/dist/ai/core/media/image/handlers/standard.js.map +1 -0
  27. package/dist/ai/core/media/image/index.d.ts +2 -0
  28. package/dist/ai/core/media/image/index.js +3 -0
  29. package/dist/ai/core/media/image/index.js.map +1 -0
  30. package/dist/ai/core/media/index.d.ts +2 -0
  31. package/dist/ai/core/media/index.js +3 -0
  32. package/dist/ai/core/media/index.js.map +1 -0
  33. package/dist/ai/core/media/speech/generateSpeech.d.ts +5 -0
  34. package/dist/ai/core/media/speech/generateSpeech.js +55 -0
  35. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -0
  36. package/dist/ai/core/media/speech/index.d.ts +2 -0
  37. package/dist/ai/core/media/speech/index.js +3 -0
  38. package/dist/ai/core/media/speech/index.js.map +1 -0
  39. package/dist/ai/core/media/types.d.ts +74 -0
  40. package/dist/ai/core/media/types.js +5 -0
  41. package/dist/ai/core/media/types.js.map +1 -0
  42. package/dist/ai/core/media/utils.d.ts +11 -0
  43. package/dist/ai/core/media/utils.js +34 -0
  44. package/dist/ai/core/media/utils.js.map +1 -0
  45. package/dist/ai/core/media/video/generateVideo.d.ts +6 -0
  46. package/dist/ai/core/media/video/generateVideo.js +32 -0
  47. package/dist/ai/core/media/video/generateVideo.js.map +1 -0
  48. package/dist/ai/core/media/video/index.d.ts +2 -0
  49. package/dist/ai/core/media/video/index.js +3 -0
  50. package/dist/ai/core/media/video/index.js.map +1 -0
  51. package/dist/ai/core/streamObject.d.ts +7 -0
  52. package/dist/ai/core/streamObject.js +57 -0
  53. package/dist/ai/core/streamObject.js.map +1 -0
  54. package/dist/ai/core/streamText.d.ts +7 -0
  55. package/dist/ai/core/streamText.js +30 -0
  56. package/dist/ai/core/streamText.js.map +1 -0
  57. package/dist/ai/core/types.d.ts +85 -0
  58. package/dist/ai/core/types.js +5 -0
  59. package/dist/ai/core/types.js.map +1 -0
  60. package/dist/ai/index.d.ts +11 -0
  61. package/dist/ai/index.js +25 -0
  62. package/dist/ai/index.js.map +1 -0
  63. package/dist/ai/providers/blocks/anthropic.d.ts +2 -0
  64. package/dist/ai/providers/blocks/anthropic.js +222 -0
  65. package/dist/ai/providers/blocks/anthropic.js.map +1 -0
  66. package/dist/ai/providers/blocks/elevenlabs.d.ts +2 -0
  67. package/dist/ai/providers/blocks/elevenlabs.js +448 -0
  68. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -0
  69. package/dist/ai/providers/blocks/fal.d.ts +2 -0
  70. package/dist/ai/providers/blocks/fal.js +311 -0
  71. package/dist/ai/providers/blocks/fal.js.map +1 -0
  72. package/dist/ai/providers/blocks/google.d.ts +2 -0
  73. package/dist/ai/providers/blocks/google.js +622 -0
  74. package/dist/ai/providers/blocks/google.js.map +1 -0
  75. package/dist/ai/providers/blocks/index.d.ts +2 -0
  76. package/dist/ai/providers/blocks/index.js +18 -0
  77. package/dist/ai/providers/blocks/index.js.map +1 -0
  78. package/dist/ai/providers/blocks/openai-compatible.d.ts +2 -0
  79. package/dist/ai/providers/blocks/openai-compatible.js +307 -0
  80. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -0
  81. package/dist/ai/providers/blocks/openai.d.ts +2 -0
  82. package/dist/ai/providers/blocks/openai.js +599 -0
  83. package/dist/ai/providers/blocks/openai.js.map +1 -0
  84. package/dist/ai/providers/blocks/xai.d.ts +2 -0
  85. package/dist/ai/providers/blocks/xai.js +246 -0
  86. package/dist/ai/providers/blocks/xai.js.map +1 -0
  87. package/dist/ai/providers/index.d.ts +2 -0
  88. package/dist/ai/providers/index.js +6 -0
  89. package/dist/ai/providers/index.js.map +1 -0
  90. package/dist/ai/providers/registry.d.ts +40 -0
  91. package/dist/ai/providers/registry.js +256 -0
  92. package/dist/ai/providers/registry.js.map +1 -0
  93. package/dist/ai/providers/types.d.ts +115 -0
  94. package/dist/ai/providers/types.js +4 -0
  95. package/dist/ai/providers/types.js.map +1 -0
  96. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  97. package/dist/ai/utils/systemGenerate.js +19 -19
  98. package/dist/ai/utils/systemGenerate.js.map +1 -1
  99. package/dist/collections/AIJobs.d.ts +2 -0
  100. package/dist/collections/AIJobs.js +81 -0
  101. package/dist/collections/AIJobs.js.map +1 -0
  102. package/dist/collections/AISettings.d.ts +2 -0
  103. package/dist/collections/AISettings.js +279 -0
  104. package/dist/collections/AISettings.js.map +1 -0
  105. package/dist/collections/Instructions.js +185 -37
  106. package/dist/collections/Instructions.js.map +1 -1
  107. package/dist/defaults.d.ts +3 -0
  108. package/dist/defaults.js +3 -0
  109. package/dist/defaults.js.map +1 -1
  110. package/dist/endpoints/buildPromptUtils.d.ts +19 -0
  111. package/dist/endpoints/buildPromptUtils.js +114 -0
  112. package/dist/endpoints/buildPromptUtils.js.map +1 -0
  113. package/dist/endpoints/chat.d.js +3 -0
  114. package/dist/endpoints/chat.d.js.map +1 -0
  115. package/dist/endpoints/fetchVoices.d.ts +2 -0
  116. package/dist/endpoints/fetchVoices.js +79 -0
  117. package/dist/endpoints/fetchVoices.js.map +1 -0
  118. package/dist/endpoints/index.js +253 -214
  119. package/dist/endpoints/index.js.map +1 -1
  120. package/dist/exports/client.d.ts +9 -0
  121. package/dist/exports/client.js +9 -0
  122. package/dist/exports/client.js.map +1 -1
  123. package/dist/fields/ComposeField/ComposeField.js +2 -2
  124. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  125. package/dist/fields/ComposeField/ComposeField.jsx +2 -2
  126. package/dist/fields/PromptEditorField/PromptEditorField.js +155 -14
  127. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  128. package/dist/fields/PromptEditorField/PromptEditorField.jsx +118 -3
  129. package/dist/index.d.ts +1 -0
  130. package/dist/index.js.map +1 -1
  131. package/dist/init.js +35 -13
  132. package/dist/init.js.map +1 -1
  133. package/dist/payload-ai.d.js +3 -0
  134. package/dist/payload-ai.d.js.map +1 -0
  135. package/dist/plugin.js +80 -9
  136. package/dist/plugin.js.map +1 -1
  137. package/dist/providers/InstructionsProvider/InstructionsProvider.js +35 -7
  138. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  139. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +27 -4
  140. package/dist/providers/InstructionsProvider/context.d.ts +1 -0
  141. package/dist/providers/InstructionsProvider/context.js +1 -0
  142. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  143. package/dist/providers/InstructionsProvider/useInstructions.js +13 -6
  144. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  145. package/dist/types.d.ts +7 -7
  146. package/dist/types.js.map +1 -1
  147. package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
  148. package/dist/ui/AIConfigDashboard/index.js +46 -0
  149. package/dist/ui/AIConfigDashboard/index.js.map +1 -0
  150. package/dist/ui/AIConfigDashboard/index.jsx +24 -0
  151. package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
  152. package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
  153. package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
  154. package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
  155. package/dist/ui/Compose/Compose.d.ts +1 -2
  156. package/dist/ui/Compose/Compose.js +116 -90
  157. package/dist/ui/Compose/Compose.js.map +1 -1
  158. package/dist/ui/Compose/Compose.jsx +111 -101
  159. package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
  160. package/dist/ui/Compose/ComposePlaceholder.js +78 -0
  161. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
  162. package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
  163. package/dist/ui/Compose/UndoRedoActions.js +3 -1
  164. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  165. package/dist/ui/Compose/UndoRedoActions.jsx +2 -1
  166. package/dist/ui/Compose/compose.module.css +1 -1
  167. package/dist/ui/Compose/hooks/menu/itemsMap.js +1 -1
  168. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  169. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  170. package/dist/ui/Compose/hooks/menu/useMenu.js +2 -2
  171. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  172. package/dist/ui/Compose/hooks/menu/useMenu.jsx +2 -2
  173. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
  174. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  175. package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
  176. package/dist/ui/Compose/hooks/useGenerate.js +71 -11
  177. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  178. package/dist/ui/Compose/hooks/useHistory.js +52 -5
  179. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  180. package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
  181. package/dist/ui/DynamicModelSelect/index.js +231 -0
  182. package/dist/ui/DynamicModelSelect/index.js.map +1 -0
  183. package/dist/ui/DynamicModelSelect/index.jsx +207 -0
  184. package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
  185. package/dist/ui/DynamicProviderSelect/index.js +101 -0
  186. package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
  187. package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
  188. package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
  189. package/dist/ui/DynamicVoiceSelect/index.js +104 -0
  190. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
  191. package/dist/ui/DynamicVoiceSelect/index.jsx +69 -0
  192. package/dist/ui/EncryptedTextField/index.d.ts +8 -0
  193. package/dist/ui/EncryptedTextField/index.js +74 -0
  194. package/dist/ui/EncryptedTextField/index.js.map +1 -0
  195. package/dist/ui/EncryptedTextField/index.jsx +35 -0
  196. package/dist/ui/Icons/LottieAnimation.js +3 -1
  197. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  198. package/dist/ui/Icons/LottieAnimation.jsx +2 -1
  199. package/dist/ui/ModelRowLabel/index.d.ts +6 -0
  200. package/dist/ui/ModelRowLabel/index.js +41 -0
  201. package/dist/ui/ModelRowLabel/index.js.map +1 -0
  202. package/dist/ui/ModelRowLabel/index.jsx +26 -0
  203. package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
  204. package/dist/ui/ProviderOptionsEditor/index.js +291 -0
  205. package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
  206. package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
  207. package/dist/ui/VoicesFetcher/index.d.ts +7 -0
  208. package/dist/ui/VoicesFetcher/index.js +72 -0
  209. package/dist/ui/VoicesFetcher/index.js.map +1 -0
  210. package/dist/ui/VoicesFetcher/index.jsx +56 -0
  211. package/dist/utilities/encryption.d.ts +2 -0
  212. package/dist/utilities/encryption.js +47 -0
  213. package/dist/utilities/encryption.js.map +1 -0
  214. package/dist/utilities/extractImageData.d.ts +9 -0
  215. package/dist/utilities/extractImageData.js +12 -2
  216. package/dist/utilities/extractImageData.js.map +1 -1
  217. package/dist/utilities/fetchImages.d.ts +14 -0
  218. package/dist/utilities/fetchImages.js +38 -0
  219. package/dist/utilities/fetchImages.js.map +1 -0
  220. package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
  221. package/dist/utilities/fieldToJsonSchema.js +66 -3
  222. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  223. package/dist/utilities/getFieldBySchemaPath.js +15 -0
  224. package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
  225. package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
  226. package/dist/utilities/getProviderOptionsFields.js +80 -0
  227. package/dist/utilities/getProviderOptionsFields.js.map +1 -0
  228. package/dist/utilities/isPluginActivated.js +1 -2
  229. package/dist/utilities/isPluginActivated.js.map +1 -1
  230. package/dist/utilities/lexicalToHTML.js.map +1 -1
  231. package/dist/utilities/resolveImageReferences.d.ts +28 -0
  232. package/dist/utilities/resolveImageReferences.js +148 -0
  233. package/dist/utilities/resolveImageReferences.js.map +1 -0
  234. package/dist/utilities/schemaConverter.d.ts +3 -0
  235. package/dist/utilities/schemaConverter.js +93 -0
  236. package/dist/utilities/schemaConverter.js.map +1 -0
  237. package/dist/utilities/setSafeLexicalState.d.ts +1 -3
  238. package/dist/utilities/setSafeLexicalState.js +1 -1
  239. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  240. package/package.json +19 -21
  241. package/dist/ai/models/anthropic/index.d.ts +0 -2
  242. package/dist/ai/models/anthropic/index.js +0 -129
  243. package/dist/ai/models/anthropic/index.js.map +0 -1
  244. package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
  245. package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
  246. package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
  247. package/dist/ai/models/elevenLabs/index.d.ts +0 -2
  248. package/dist/ai/models/elevenLabs/index.js +0 -133
  249. package/dist/ai/models/elevenLabs/index.js.map +0 -1
  250. package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
  251. package/dist/ai/models/elevenLabs/voices.js +0 -24
  252. package/dist/ai/models/elevenLabs/voices.js.map +0 -1
  253. package/dist/ai/models/generateObject.d.ts +0 -11
  254. package/dist/ai/models/generateObject.js +0 -22
  255. package/dist/ai/models/generateObject.js.map +0 -1
  256. package/dist/ai/models/google/generateImage.d.ts +0 -9
  257. package/dist/ai/models/google/generateImage.js +0 -27
  258. package/dist/ai/models/google/generateImage.js.map +0 -1
  259. package/dist/ai/models/google/index.d.ts +0 -2
  260. package/dist/ai/models/google/index.js +0 -201
  261. package/dist/ai/models/google/index.js.map +0 -1
  262. package/dist/ai/models/index.d.ts +0 -2
  263. package/dist/ai/models/index.js +0 -13
  264. package/dist/ai/models/index.js.map +0 -1
  265. package/dist/ai/models/openai/generateImage.d.ts +0 -5
  266. package/dist/ai/models/openai/generateImage.js +0 -31
  267. package/dist/ai/models/openai/generateImage.js.map +0 -1
  268. package/dist/ai/models/openai/generateVoice.d.ts +0 -6
  269. package/dist/ai/models/openai/generateVoice.js +0 -19
  270. package/dist/ai/models/openai/generateVoice.js.map +0 -1
  271. package/dist/ai/models/openai/index.d.ts +0 -2
  272. package/dist/ai/models/openai/index.js +0 -428
  273. package/dist/ai/models/openai/index.js.map +0 -1
  274. package/dist/ai/models/openai/openai.d.ts +0 -1
  275. package/dist/ai/models/openai/openai.js +0 -8
  276. package/dist/ai/models/openai/openai.js.map +0 -1
  277. package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
  278. package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
  279. package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
  280. package/dist/types.d.js +0 -3
  281. package/dist/types.d.js.map +0 -1
  282. package/dist/utilities/getGenerationModels.d.ts +0 -2
  283. package/dist/utilities/getGenerationModels.js +0 -10
  284. package/dist/utilities/getGenerationModels.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  'use client';
2
2
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
3
3
  import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
4
- import { Popup, useDocumentDrawer, useField } from '@payloadcms/ui';
4
+ import { Popup, useField } from '@payloadcms/ui';
5
5
  import React, { useCallback, useMemo, useState } from 'react';
6
- import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
6
+ import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
7
7
  import { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js';
8
8
  import { PluginIcon } from '../Icons/Icons.js';
9
9
  import styles from './compose.module.css';
@@ -12,92 +12,121 @@ import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
12
12
  import { useGenerate } from './hooks/useGenerate.js';
13
13
  import { UndoRedoActions } from './UndoRedoActions.js';
14
14
  export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
15
- const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({
16
- id: instructionId,
17
- collectionSlug: PLUGIN_INSTRUCTIONS_TABLE
18
- });
19
15
  const pathFromContext = descriptionProps?.path;
20
16
  const { editor: lexicalEditor } = useEditorConfigContext();
17
+ // Get global openDrawer from context
18
+ const { openDrawer } = useInstructions();
21
19
  // Initialize global active-field tracking
22
20
  useActiveFieldTracking();
23
21
  const [isProcessing, setIsProcessing] = useState(false);
24
- const { generate, isLoading, stop } = useGenerate({
22
+ const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({
25
23
  instructionId
26
24
  });
27
- const { ActiveComponent, Menu } = useMenu({
28
- onCompose: ()=>{
29
- console.log('Composing...');
30
- setIsProcessing(true);
31
- generate({
32
- action: 'Compose'
33
- }).catch((reason)=>{
34
- console.error('Compose : ', reason);
35
- }).finally(()=>{
36
- setIsProcessing(false);
37
- });
38
- },
39
- onExpand: ()=>{
40
- console.log('Expanding...');
41
- generate({
42
- action: 'Expand'
43
- }).catch((reason)=>{
44
- console.error('Compose : ', reason);
45
- }).finally(()=>{
46
- setIsProcessing(false);
47
- });
48
- },
49
- onProofread: ()=>{
50
- console.log('Proofreading...');
51
- generate({
52
- action: 'Proofread'
53
- }).catch((reason)=>{
54
- console.error('Compose : ', reason);
55
- }).finally(()=>{
56
- setIsProcessing(false);
57
- });
58
- },
59
- onRephrase: ()=>{
60
- console.log('Rephrasing...');
61
- generate({
62
- action: 'Rephrase'
63
- }).catch((reason)=>{
64
- console.error('Compose : ', reason);
65
- }).finally(()=>{
66
- setIsProcessing(false);
67
- });
68
- },
69
- onSettings: isConfigAllowed ? openDrawer : undefined,
70
- onSimplify: ()=>{
71
- console.log('Simplifying...');
72
- generate({
73
- action: 'Simplify'
74
- }).catch((reason)=>{
75
- console.error('Compose : ', reason);
76
- }).finally(()=>{
77
- setIsProcessing(false);
78
- });
79
- },
80
- onSummarize: ()=>{
81
- console.log('Summarizing...');
82
- generate({
83
- action: 'Summarize'
84
- }).catch((reason)=>{
85
- console.error('Compose : ', reason);
86
- }).finally(()=>{
87
- setIsProcessing(false);
88
- });
89
- },
90
- onTranslate: (data)=>{
91
- console.log('Translating...');
92
- generate({
93
- action: 'Translate',
94
- params: data
95
- }).catch((reason)=>{
96
- console.error('Compose : ', reason);
97
- }).finally(()=>{
98
- setIsProcessing(false);
99
- });
25
+ // Memoize menu event handlers to prevent recreation on every render
26
+ const onCompose = useCallback(()=>{
27
+ console.log('Composing...');
28
+ setIsProcessing(true);
29
+ generate({
30
+ action: 'Compose'
31
+ }).catch((reason)=>{
32
+ console.error('Compose : ', reason);
33
+ }).finally(()=>{
34
+ setIsProcessing(false);
35
+ });
36
+ }, [
37
+ generate
38
+ ]);
39
+ const onExpand = useCallback(()=>{
40
+ console.log('Expanding...');
41
+ generate({
42
+ action: 'Expand'
43
+ }).catch((reason)=>{
44
+ console.error('Compose : ', reason);
45
+ }).finally(()=>{
46
+ setIsProcessing(false);
47
+ });
48
+ }, [
49
+ generate
50
+ ]);
51
+ const onProofread = useCallback(()=>{
52
+ console.log('Proofreading...');
53
+ generate({
54
+ action: 'Proofread'
55
+ }).catch((reason)=>{
56
+ console.error('Compose : ', reason);
57
+ }).finally(()=>{
58
+ setIsProcessing(false);
59
+ });
60
+ }, [
61
+ generate
62
+ ]);
63
+ const onRephrase = useCallback(()=>{
64
+ console.log('Rephrasing...');
65
+ generate({
66
+ action: 'Rephrase'
67
+ }).catch((reason)=>{
68
+ console.error('Compose : ', reason);
69
+ }).finally(()=>{
70
+ setIsProcessing(false);
71
+ });
72
+ }, [
73
+ generate
74
+ ]);
75
+ const onSimplify = useCallback(()=>{
76
+ console.log('Simplifying...');
77
+ generate({
78
+ action: 'Simplify'
79
+ }).catch((reason)=>{
80
+ console.error('Compose : ', reason);
81
+ }).finally(()=>{
82
+ setIsProcessing(false);
83
+ });
84
+ }, [
85
+ generate
86
+ ]);
87
+ const onSummarize = useCallback(()=>{
88
+ console.log('Summarizing...');
89
+ generate({
90
+ action: 'Summarize'
91
+ }).catch((reason)=>{
92
+ console.error('Compose : ', reason);
93
+ }).finally(()=>{
94
+ setIsProcessing(false);
95
+ });
96
+ }, [
97
+ generate
98
+ ]);
99
+ const onTranslate = useCallback((data)=>{
100
+ console.log('Translating...');
101
+ generate({
102
+ action: 'Translate',
103
+ params: data
104
+ }).catch((reason)=>{
105
+ console.error('Compose : ', reason);
106
+ }).finally(()=>{
107
+ setIsProcessing(false);
108
+ });
109
+ }, [
110
+ generate
111
+ ]);
112
+ const handleOpenSettings = useCallback(()=>{
113
+ if (isConfigAllowed) {
114
+ openDrawer(instructionId);
100
115
  }
116
+ }, [
117
+ isConfigAllowed,
118
+ openDrawer,
119
+ instructionId
120
+ ]);
121
+ const { ActiveComponent, Menu } = useMenu({
122
+ onCompose,
123
+ onExpand,
124
+ onProofread,
125
+ onRephrase,
126
+ onSettings: isConfigAllowed ? handleOpenSettings : undefined,
127
+ onSimplify,
128
+ onSummarize,
129
+ onTranslate
101
130
  }, {
102
131
  isConfigAllowed
103
132
  });
@@ -108,7 +137,7 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
108
137
  if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {
109
138
  setSafeLexicalState(JSON.stringify(val), lexicalEditor);
110
139
  }
111
- // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo
140
+ // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
112
141
  }, []);
113
142
  const popupRender = useCallback(({ close })=>{
114
143
  return /*#__PURE__*/ _jsx(Menu, {
@@ -120,32 +149,29 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed })=>{
120
149
  isLoading,
121
150
  Menu
122
151
  ]);
152
+ // Combine loading states to reduce re-renders
153
+ const isAnyLoading = isProcessing || isLoading || isJobActive;
123
154
  const memoizedPopup = useMemo(()=>{
124
155
  return /*#__PURE__*/ _jsx(Popup, {
125
156
  button: /*#__PURE__*/ _jsx(PluginIcon, {
126
- isLoading: isProcessing || isLoading
157
+ isLoading: isAnyLoading
127
158
  }),
128
159
  render: popupRender,
129
160
  verticalAlign: "bottom"
130
161
  });
131
162
  }, [
132
163
  popupRender,
133
- isProcessing,
134
- isLoading
164
+ isAnyLoading
135
165
  ]);
136
166
  return /*#__PURE__*/ _jsxs("label", {
137
167
  className: `payloadai-compose__actions ${styles.actions}`,
138
168
  onClick: (e)=>e.preventDefault(),
139
169
  role: "presentation",
140
170
  children: [
141
- /*#__PURE__*/ _jsx(DocumentDrawer, {
142
- onSave: ()=>{
143
- closeDrawer();
144
- }
145
- }),
146
171
  memoizedPopup,
147
172
  /*#__PURE__*/ _jsx(ActiveComponent, {
148
- isLoading: isProcessing || isLoading,
173
+ isLoading: isProcessing || isLoading || isJobActive,
174
+ loadingLabel: isJobActive ? jobStatus === 'running' ? `Video ${Math.max(0, Math.min(100, Math.round(jobProgress ?? 0)))}%` : jobStatus || 'Queued' : undefined,
149
175
  stop: stop
150
176
  }),
151
177
  /*#__PURE__*/ _jsx(UndoRedoActions, {
@@ -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, useDocumentDrawer, useField } from '@payloadcms/ui'\nimport React, { useCallback, useMemo, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.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\ntype 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 [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const pathFromContext = descriptionProps?.path\n const { editor: lexicalEditor } = useEditorConfigContext()\n\n // Initialize global active-field tracking\n useActiveFieldTracking()\n\n const [isProcessing, setIsProcessing] = useState<boolean>(false)\n const { generate, isLoading, stop } = useGenerate({ instructionId })\n\n const { ActiveComponent, Menu } = useMenu(\n {\n onCompose: () => {\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 },\n onExpand: () => {\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 },\n onProofread: () => {\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 },\n onRephrase: () => {\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 },\n onSettings: isConfigAllowed ? openDrawer : undefined,\n onSimplify: () => {\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 },\n onSummarize: () => {\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 },\n onTranslate: (data) => {\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 },\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\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 const memoizedPopup = useMemo(() => {\n return (\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={popupRender}\n verticalAlign=\"bottom\"\n />\n )\n }, [popupRender, isProcessing, isLoading])\n\n return (\n <label\n className={`payloadai-compose__actions ${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n {memoizedPopup}\n <ActiveComponent isLoading={isProcessing || isLoading} stop={stop} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n )\n}\n"],"names":["useEditorConfigContext","Popup","useDocumentDrawer","useField","React","useCallback","useMemo","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","styles","useMenu","useActiveFieldTracking","useGenerate","UndoRedoActions","Compose","descriptionProps","instructionId","isConfigAllowed","DocumentDrawer","_","closeDrawer","openDrawer","id","collectionSlug","pathFromContext","path","editor","lexicalEditor","isProcessing","setIsProcessing","generate","isLoading","stop","ActiveComponent","Menu","onCompose","console","log","action","catch","reason","error","finally","onExpand","onProofread","onRephrase","onSettings","undefined","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","JSON","stringify","popupRender","close","onClose","memoizedPopup","button","render","verticalAlign","label","className","actions","onClick","e","preventDefault","role","onSave","onChange"],"mappings":"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"}
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":"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"}
@@ -1,8 +1,8 @@
1
1
  'use client';
2
2
  import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
3
- import { Popup, useDocumentDrawer, useField } from '@payloadcms/ui';
3
+ import { Popup, useField } from '@payloadcms/ui';
4
4
  import React, { useCallback, useMemo, useState } from 'react';
5
- import { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js';
5
+ import { useInstructions } from '../../providers/InstructionsProvider/useInstructions.js';
6
6
  import { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js';
7
7
  import { PluginIcon } from '../Icons/Icons.js';
8
8
  import styles from './compose.module.css';
@@ -11,104 +11,115 @@ import { useActiveFieldTracking } from './hooks/useActiveFieldTracking.js';
11
11
  import { useGenerate } from './hooks/useGenerate.js';
12
12
  import { UndoRedoActions } from './UndoRedoActions.js';
13
13
  export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) => {
14
- const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({
15
- id: instructionId,
16
- collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,
17
- });
18
14
  const pathFromContext = descriptionProps?.path;
19
15
  const { editor: lexicalEditor } = useEditorConfigContext();
16
+ // Get global openDrawer from context
17
+ const { openDrawer } = useInstructions();
20
18
  // Initialize global active-field tracking
21
19
  useActiveFieldTracking();
22
20
  const [isProcessing, setIsProcessing] = useState(false);
23
- const { generate, isLoading, stop } = useGenerate({ instructionId });
21
+ const { generate, isJobActive, isLoading, jobProgress, jobStatus, stop } = useGenerate({ instructionId });
22
+ // Memoize menu event handlers to prevent recreation on every render
23
+ const onCompose = useCallback(() => {
24
+ console.log('Composing...');
25
+ setIsProcessing(true);
26
+ generate({
27
+ action: 'Compose',
28
+ })
29
+ .catch((reason) => {
30
+ console.error('Compose : ', reason);
31
+ })
32
+ .finally(() => {
33
+ setIsProcessing(false);
34
+ });
35
+ }, [generate]);
36
+ const onExpand = useCallback(() => {
37
+ console.log('Expanding...');
38
+ generate({
39
+ action: 'Expand',
40
+ })
41
+ .catch((reason) => {
42
+ console.error('Compose : ', reason);
43
+ })
44
+ .finally(() => {
45
+ setIsProcessing(false);
46
+ });
47
+ }, [generate]);
48
+ const onProofread = useCallback(() => {
49
+ console.log('Proofreading...');
50
+ generate({
51
+ action: 'Proofread',
52
+ })
53
+ .catch((reason) => {
54
+ console.error('Compose : ', reason);
55
+ })
56
+ .finally(() => {
57
+ setIsProcessing(false);
58
+ });
59
+ }, [generate]);
60
+ const onRephrase = useCallback(() => {
61
+ console.log('Rephrasing...');
62
+ generate({
63
+ action: 'Rephrase',
64
+ })
65
+ .catch((reason) => {
66
+ console.error('Compose : ', reason);
67
+ })
68
+ .finally(() => {
69
+ setIsProcessing(false);
70
+ });
71
+ }, [generate]);
72
+ const onSimplify = useCallback(() => {
73
+ console.log('Simplifying...');
74
+ generate({
75
+ action: 'Simplify',
76
+ })
77
+ .catch((reason) => {
78
+ console.error('Compose : ', reason);
79
+ })
80
+ .finally(() => {
81
+ setIsProcessing(false);
82
+ });
83
+ }, [generate]);
84
+ const onSummarize = useCallback(() => {
85
+ console.log('Summarizing...');
86
+ generate({
87
+ action: 'Summarize',
88
+ })
89
+ .catch((reason) => {
90
+ console.error('Compose : ', reason);
91
+ })
92
+ .finally(() => {
93
+ setIsProcessing(false);
94
+ });
95
+ }, [generate]);
96
+ const onTranslate = useCallback((data) => {
97
+ console.log('Translating...');
98
+ generate({
99
+ action: 'Translate',
100
+ params: data,
101
+ })
102
+ .catch((reason) => {
103
+ console.error('Compose : ', reason);
104
+ })
105
+ .finally(() => {
106
+ setIsProcessing(false);
107
+ });
108
+ }, [generate]);
109
+ const handleOpenSettings = useCallback(() => {
110
+ if (isConfigAllowed) {
111
+ openDrawer(instructionId);
112
+ }
113
+ }, [isConfigAllowed, openDrawer, instructionId]);
24
114
  const { ActiveComponent, Menu } = useMenu({
25
- onCompose: () => {
26
- console.log('Composing...');
27
- setIsProcessing(true);
28
- generate({
29
- action: 'Compose',
30
- })
31
- .catch((reason) => {
32
- console.error('Compose : ', reason);
33
- })
34
- .finally(() => {
35
- setIsProcessing(false);
36
- });
37
- },
38
- onExpand: () => {
39
- console.log('Expanding...');
40
- generate({
41
- action: 'Expand',
42
- })
43
- .catch((reason) => {
44
- console.error('Compose : ', reason);
45
- })
46
- .finally(() => {
47
- setIsProcessing(false);
48
- });
49
- },
50
- onProofread: () => {
51
- console.log('Proofreading...');
52
- generate({
53
- action: 'Proofread',
54
- })
55
- .catch((reason) => {
56
- console.error('Compose : ', reason);
57
- })
58
- .finally(() => {
59
- setIsProcessing(false);
60
- });
61
- },
62
- onRephrase: () => {
63
- console.log('Rephrasing...');
64
- generate({
65
- action: 'Rephrase',
66
- })
67
- .catch((reason) => {
68
- console.error('Compose : ', reason);
69
- })
70
- .finally(() => {
71
- setIsProcessing(false);
72
- });
73
- },
74
- onSettings: isConfigAllowed ? openDrawer : undefined,
75
- onSimplify: () => {
76
- console.log('Simplifying...');
77
- generate({
78
- action: 'Simplify',
79
- })
80
- .catch((reason) => {
81
- console.error('Compose : ', reason);
82
- })
83
- .finally(() => {
84
- setIsProcessing(false);
85
- });
86
- },
87
- onSummarize: () => {
88
- console.log('Summarizing...');
89
- generate({
90
- action: 'Summarize',
91
- })
92
- .catch((reason) => {
93
- console.error('Compose : ', reason);
94
- })
95
- .finally(() => {
96
- setIsProcessing(false);
97
- });
98
- },
99
- onTranslate: (data) => {
100
- console.log('Translating...');
101
- generate({
102
- action: 'Translate',
103
- params: data,
104
- })
105
- .catch((reason) => {
106
- console.error('Compose : ', reason);
107
- })
108
- .finally(() => {
109
- setIsProcessing(false);
110
- });
111
- },
115
+ onCompose,
116
+ onExpand,
117
+ onProofread,
118
+ onRephrase,
119
+ onSettings: isConfigAllowed ? handleOpenSettings : undefined,
120
+ onSimplify,
121
+ onSummarize,
122
+ onTranslate,
112
123
  }, {
113
124
  isConfigAllowed,
114
125
  });
@@ -119,20 +130,19 @@ export const Compose = ({ descriptionProps, instructionId, isConfigAllowed }) =>
119
130
  if (val && typeof val === 'object' && 'root' in val && lexicalEditor) {
120
131
  setSafeLexicalState(JSON.stringify(val), lexicalEditor);
121
132
  }
122
- // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo
133
+ // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo - revisit
123
134
  }, []);
124
135
  const popupRender = useCallback(({ close }) => {
125
136
  return <Menu isLoading={isProcessing || isLoading} onClose={close}/>;
126
137
  }, [isProcessing, isLoading, Menu]);
138
+ // Combine loading states to reduce re-renders
139
+ const isAnyLoading = isProcessing || isLoading || isJobActive;
127
140
  const memoizedPopup = useMemo(() => {
128
- return (<Popup button={<PluginIcon isLoading={isProcessing || isLoading}/>} render={popupRender} verticalAlign="bottom"/>);
129
- }, [popupRender, isProcessing, isLoading]);
141
+ return (<Popup button={<PluginIcon isLoading={isAnyLoading}/>} render={popupRender} verticalAlign="bottom"/>);
142
+ }, [popupRender, isAnyLoading]);
130
143
  return (<label className={`payloadai-compose__actions ${styles.actions}`} onClick={(e) => e.preventDefault()} role="presentation">
131
- <DocumentDrawer onSave={() => {
132
- closeDrawer();
133
- }}/>
134
144
  {memoizedPopup}
135
- <ActiveComponent isLoading={isProcessing || isLoading} stop={stop}/>
145
+ <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}/>
136
146
  <UndoRedoActions onChange={(val) => {
137
147
  setValue(val);
138
148
  setIfValueIsLexicalState(val);
@@ -0,0 +1,7 @@
1
+ import type { FC } from 'react';
2
+ import type { ComposeProps } from './Compose.js';
3
+ /**
4
+ * Lightweight placeholder component that lazy-loads Compose when field becomes active.
5
+ * Uses MutationObserver to watch for .ai-plugin-active class added by useActiveFieldTracking.
6
+ */
7
+ export declare const ComposePlaceholder: FC<ComposeProps>;
@@ -0,0 +1,78 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import React, { useEffect, useRef, useState } from 'react';
4
+ import { Compose } from './Compose.js';
5
+ /**
6
+ * Lightweight placeholder component that lazy-loads Compose when field becomes active.
7
+ * Uses MutationObserver to watch for .ai-plugin-active class added by useActiveFieldTracking.
8
+ */ export const ComposePlaceholder = (props)=>{
9
+ const [shouldMount, setShouldMount] = useState(false);
10
+ const containerRef = useRef(null);
11
+ const unmountTimerRef = useRef(null);
12
+ useEffect(()=>{
13
+ const container = containerRef.current;
14
+ if (!container) {
15
+ return;
16
+ }
17
+ // Find the parent .field-type container
18
+ const fieldContainer = container.closest('.field-type');
19
+ if (!fieldContainer) {
20
+ return;
21
+ }
22
+ // Watch for .ai-plugin-active class changes
23
+ const observer = new MutationObserver((mutations)=>{
24
+ for (const mutation of mutations){
25
+ if (mutation.type === 'attributes' && mutation.attributeName === 'class') {
26
+ if (fieldContainer.classList.contains('ai-plugin-active')) {
27
+ // Field is active - mount Compose and cancel any pending unmount
28
+ if (unmountTimerRef.current) {
29
+ clearTimeout(unmountTimerRef.current);
30
+ unmountTimerRef.current = null;
31
+ }
32
+ setShouldMount(true);
33
+ } else if (shouldMount) {
34
+ // Field is inactive - schedule unmount after delay
35
+ if (unmountTimerRef.current) {
36
+ clearTimeout(unmountTimerRef.current);
37
+ }
38
+ unmountTimerRef.current = setTimeout(()=>{
39
+ setShouldMount(false);
40
+ unmountTimerRef.current = null;
41
+ }, 1200) // 500ms delay to prevent rapid remounting
42
+ ;
43
+ }
44
+ break;
45
+ }
46
+ }
47
+ });
48
+ observer.observe(fieldContainer, {
49
+ attributeFilter: [
50
+ 'class'
51
+ ],
52
+ attributes: true
53
+ });
54
+ // Check initial state in case field is already active
55
+ if (fieldContainer.classList.contains('ai-plugin-active')) {
56
+ setShouldMount(true);
57
+ }
58
+ return ()=>{
59
+ observer.disconnect();
60
+ if (unmountTimerRef.current) {
61
+ clearTimeout(unmountTimerRef.current);
62
+ }
63
+ };
64
+ }, [
65
+ shouldMount
66
+ ]);
67
+ return /*#__PURE__*/ _jsx("div", {
68
+ ref: containerRef,
69
+ style: {
70
+ display: 'contents'
71
+ },
72
+ children: shouldMount ? /*#__PURE__*/ _jsx(Compose, {
73
+ ...props
74
+ }) : null
75
+ });
76
+ };
77
+
78
+ //# sourceMappingURL=ComposePlaceholder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/Compose/ComposePlaceholder.tsx"],"sourcesContent":["'use client'\n\nimport type { FC } from 'react'\n\nimport React, { useEffect, useRef, useState } from 'react'\n\nimport type { ComposeProps } from './Compose.js'\n\nimport { Compose } from './Compose.js'\n\n/**\n * Lightweight placeholder component that lazy-loads Compose when field becomes active.\n * Uses MutationObserver to watch for .ai-plugin-active class added by useActiveFieldTracking.\n */\nexport const ComposePlaceholder: FC<ComposeProps> = (props) => {\n const [shouldMount, setShouldMount] = useState(false)\n const containerRef = useRef<HTMLDivElement>(null)\n const unmountTimerRef = useRef<null | ReturnType<typeof setTimeout>>(null)\n\n useEffect(() => {\n const container = containerRef.current\n if (!container) {\n return\n }\n\n // Find the parent .field-type container\n const fieldContainer = container.closest('.field-type')\n if (!fieldContainer) {\n return\n }\n\n // Watch for .ai-plugin-active class changes\n const observer = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type === 'attributes' && mutation.attributeName === 'class') {\n if (fieldContainer.classList.contains('ai-plugin-active')) {\n // Field is active - mount Compose and cancel any pending unmount\n if (unmountTimerRef.current) {\n clearTimeout(unmountTimerRef.current)\n unmountTimerRef.current = null\n }\n setShouldMount(true)\n } else if (shouldMount) {\n // Field is inactive - schedule unmount after delay\n if (unmountTimerRef.current) {\n clearTimeout(unmountTimerRef.current)\n }\n unmountTimerRef.current = setTimeout(() => {\n setShouldMount(false)\n unmountTimerRef.current = null\n }, 1200) // 500ms delay to prevent rapid remounting\n }\n break\n }\n }\n })\n\n observer.observe(fieldContainer, {\n attributeFilter: ['class'],\n attributes: true,\n })\n\n // Check initial state in case field is already active\n if (fieldContainer.classList.contains('ai-plugin-active')) {\n setShouldMount(true)\n }\n\n return () => {\n observer.disconnect()\n if (unmountTimerRef.current) {\n clearTimeout(unmountTimerRef.current)\n }\n }\n }, [shouldMount])\n\n return (\n <div ref={containerRef} style={{ display: 'contents' }}>\n {shouldMount ? <Compose {...props} /> : null}\n </div>\n )\n}\n"],"names":["React","useEffect","useRef","useState","Compose","ComposePlaceholder","props","shouldMount","setShouldMount","containerRef","unmountTimerRef","container","current","fieldContainer","closest","observer","MutationObserver","mutations","mutation","type","attributeName","classList","contains","clearTimeout","setTimeout","observe","attributeFilter","attributes","disconnect","div","ref","style","display"],"mappings":"AAAA;;AAIA,OAAOA,SAASC,SAAS,EAAEC,MAAM,EAAEC,QAAQ,QAAQ,QAAO;AAI1D,SAASC,OAAO,QAAQ,eAAc;AAEtC;;;CAGC,GACD,OAAO,MAAMC,qBAAuC,CAACC;IACnD,MAAM,CAACC,aAAaC,eAAe,GAAGL,SAAS;IAC/C,MAAMM,eAAeP,OAAuB;IAC5C,MAAMQ,kBAAkBR,OAA6C;IAErED,UAAU;QACR,MAAMU,YAAYF,aAAaG,OAAO;QACtC,IAAI,CAACD,WAAW;YACd;QACF;QAEA,wCAAwC;QACxC,MAAME,iBAAiBF,UAAUG,OAAO,CAAC;QACzC,IAAI,CAACD,gBAAgB;YACnB;QACF;QAEA,4CAA4C;QAC5C,MAAME,WAAW,IAAIC,iBAAiB,CAACC;YACrC,KAAK,MAAMC,YAAYD,UAAW;gBAChC,IAAIC,SAASC,IAAI,KAAK,gBAAgBD,SAASE,aAAa,KAAK,SAAS;oBACxE,IAAIP,eAAeQ,SAAS,CAACC,QAAQ,CAAC,qBAAqB;wBACzD,iEAAiE;wBACjE,IAAIZ,gBAAgBE,OAAO,EAAE;4BAC3BW,aAAab,gBAAgBE,OAAO;4BACpCF,gBAAgBE,OAAO,GAAG;wBAC5B;wBACAJ,eAAe;oBACjB,OAAO,IAAID,aAAa;wBACtB,mDAAmD;wBACnD,IAAIG,gBAAgBE,OAAO,EAAE;4BAC3BW,aAAab,gBAAgBE,OAAO;wBACtC;wBACAF,gBAAgBE,OAAO,GAAGY,WAAW;4BACnChB,eAAe;4BACfE,gBAAgBE,OAAO,GAAG;wBAC5B,GAAG,MAAM,0CAA0C;;oBACrD;oBACA;gBACF;YACF;QACF;QAEAG,SAASU,OAAO,CAACZ,gBAAgB;YAC/Ba,iBAAiB;gBAAC;aAAQ;YAC1BC,YAAY;QACd;QAEA,sDAAsD;QACtD,IAAId,eAAeQ,SAAS,CAACC,QAAQ,CAAC,qBAAqB;YACzDd,eAAe;QACjB;QAEA,OAAO;YACLO,SAASa,UAAU;YACnB,IAAIlB,gBAAgBE,OAAO,EAAE;gBAC3BW,aAAab,gBAAgBE,OAAO;YACtC;QACF;IACF,GAAG;QAACL;KAAY;IAEhB,qBACE,KAACsB;QAAIC,KAAKrB;QAAcsB,OAAO;YAAEC,SAAS;QAAW;kBAClDzB,4BAAc,KAACH;YAAS,GAAGE,KAAK;aAAO;;AAG9C,EAAC"}