@ai-stack/payloadcms 3.2.26 → 3.68.0-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (313) 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 +100 -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 +54 -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 +223 -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 +449 -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 +312 -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 +623 -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 +308 -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 +600 -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 +247 -0
  86. package/dist/ai/providers/blocks/xai.js.map +1 -0
  87. package/dist/ai/providers/icons.d.ts +7 -0
  88. package/dist/ai/providers/icons.js +9 -0
  89. package/dist/ai/providers/icons.js.map +1 -0
  90. package/dist/ai/providers/index.d.ts +2 -0
  91. package/dist/ai/providers/index.js +6 -0
  92. package/dist/ai/providers/index.js.map +1 -0
  93. package/dist/ai/providers/registry.d.ts +40 -0
  94. package/dist/ai/providers/registry.js +267 -0
  95. package/dist/ai/providers/registry.js.map +1 -0
  96. package/dist/ai/providers/types.d.ts +115 -0
  97. package/dist/ai/providers/types.js +4 -0
  98. package/dist/ai/providers/types.js.map +1 -0
  99. package/dist/ai/utils/systemGenerate.d.ts +1 -1
  100. package/dist/ai/utils/systemGenerate.js +19 -19
  101. package/dist/ai/utils/systemGenerate.js.map +1 -1
  102. package/dist/collections/AIJobs.d.ts +2 -0
  103. package/dist/collections/AIJobs.js +81 -0
  104. package/dist/collections/AIJobs.js.map +1 -0
  105. package/dist/collections/AISettings.d.ts +2 -0
  106. package/dist/collections/AISettings.js +279 -0
  107. package/dist/collections/AISettings.js.map +1 -0
  108. package/dist/collections/Instructions.js +224 -50
  109. package/dist/collections/Instructions.js.map +1 -1
  110. package/dist/defaults.d.ts +3 -0
  111. package/dist/defaults.js +3 -0
  112. package/dist/defaults.js.map +1 -1
  113. package/dist/endpoints/buildPromptUtils.d.ts +19 -0
  114. package/dist/endpoints/buildPromptUtils.js +114 -0
  115. package/dist/endpoints/buildPromptUtils.js.map +1 -0
  116. package/dist/endpoints/chat.d.ts +4 -0
  117. package/dist/endpoints/fetchFields.js +0 -7
  118. package/dist/endpoints/fetchFields.js.map +1 -1
  119. package/dist/endpoints/fetchVoices.d.ts +2 -0
  120. package/dist/endpoints/fetchVoices.js +79 -0
  121. package/dist/endpoints/fetchVoices.js.map +1 -0
  122. package/dist/endpoints/index.js +339 -232
  123. package/dist/endpoints/index.js.map +1 -1
  124. package/dist/exports/client.d.ts +9 -0
  125. package/dist/exports/client.js +9 -0
  126. package/dist/exports/client.js.map +1 -1
  127. package/dist/exports/fields.d.ts +1 -0
  128. package/dist/exports/fields.js +1 -0
  129. package/dist/exports/fields.js.map +1 -1
  130. package/dist/fields/ArrayComposeField/ArrayComposeField.d.ts +15 -0
  131. package/dist/fields/ArrayComposeField/ArrayComposeField.js +87 -0
  132. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -0
  133. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +73 -0
  134. package/dist/fields/ComposeField/ComposeField.js +2 -2
  135. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  136. package/dist/fields/ComposeField/ComposeField.jsx +2 -2
  137. package/dist/fields/PromptEditorField/PromptEditorField.js +162 -16
  138. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  139. package/dist/fields/PromptEditorField/PromptEditorField.jsx +123 -5
  140. package/dist/index.d.ts +3 -0
  141. package/dist/index.js +1 -0
  142. package/dist/index.js.map +1 -1
  143. package/dist/init.js +63 -65
  144. package/dist/init.js.map +1 -1
  145. package/dist/payload-ai.d.ts +149 -0
  146. package/dist/plugin.js +94 -46
  147. package/dist/plugin.js.map +1 -1
  148. package/dist/providers/InstructionsProvider/InstructionsProvider.js +38 -7
  149. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  150. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +30 -4
  151. package/dist/providers/InstructionsProvider/context.d.ts +1 -0
  152. package/dist/providers/InstructionsProvider/context.js +1 -0
  153. package/dist/providers/InstructionsProvider/context.js.map +1 -1
  154. package/dist/providers/InstructionsProvider/useInstructions.js +30 -10
  155. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  156. package/dist/styles.d.ts +11 -0
  157. package/dist/types/handlebars-async-helpers.d.ts +1 -0
  158. package/dist/types/handlebars-dist-handlebars.d.ts +1 -0
  159. package/dist/types/react-mentions.d.ts +1 -0
  160. package/dist/types.d.ts +6 -16
  161. package/dist/types.js.map +1 -1
  162. package/dist/ui/AIConfigDashboard/index.d.ts +2 -0
  163. package/dist/ui/AIConfigDashboard/index.js +46 -0
  164. package/dist/ui/AIConfigDashboard/index.js.map +1 -0
  165. package/dist/ui/AIConfigDashboard/index.jsx +24 -0
  166. package/dist/ui/ApiKeyStatusIndicator/index.d.ts +6 -0
  167. package/dist/ui/ApiKeyStatusIndicator/index.js +39 -0
  168. package/dist/ui/ApiKeyStatusIndicator/index.js.map +1 -0
  169. package/dist/ui/ApiKeyStatusIndicator/index.jsx +29 -0
  170. package/dist/ui/Compose/Compose.d.ts +2 -2
  171. package/dist/ui/Compose/Compose.js +118 -92
  172. package/dist/ui/Compose/Compose.js.map +1 -1
  173. package/dist/ui/Compose/Compose.jsx +113 -103
  174. package/dist/ui/Compose/ComposePlaceholder.d.ts +7 -0
  175. package/dist/ui/Compose/ComposePlaceholder.js +78 -0
  176. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -0
  177. package/dist/ui/Compose/ComposePlaceholder.jsx +66 -0
  178. package/dist/ui/Compose/UndoRedoActions.d.ts +2 -2
  179. package/dist/ui/Compose/UndoRedoActions.js +11 -6
  180. package/dist/ui/Compose/UndoRedoActions.js.map +1 -1
  181. package/dist/ui/Compose/UndoRedoActions.jsx +8 -6
  182. package/dist/ui/Compose/compose.module.css +57 -17
  183. package/dist/ui/Compose/hooks/menu/itemsMap.js +13 -7
  184. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  185. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -1
  186. package/dist/ui/Compose/hooks/menu/useMenu.js +28 -17
  187. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  188. package/dist/ui/Compose/hooks/menu/useMenu.jsx +27 -14
  189. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +69 -10
  190. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  191. package/dist/ui/Compose/hooks/useGenerate.d.ts +3 -0
  192. package/dist/ui/Compose/hooks/useGenerate.js +71 -11
  193. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  194. package/dist/ui/Compose/hooks/useHistory.d.ts +0 -1
  195. package/dist/ui/Compose/hooks/useHistory.js +113 -26
  196. package/dist/ui/Compose/hooks/useHistory.js.map +1 -1
  197. package/dist/ui/DynamicModelSelect/index.d.ts +7 -0
  198. package/dist/ui/DynamicModelSelect/index.js +231 -0
  199. package/dist/ui/DynamicModelSelect/index.js.map +1 -0
  200. package/dist/ui/DynamicModelSelect/index.jsx +207 -0
  201. package/dist/ui/DynamicProviderSelect/index.d.ts +7 -0
  202. package/dist/ui/DynamicProviderSelect/index.js +101 -0
  203. package/dist/ui/DynamicProviderSelect/index.js.map +1 -0
  204. package/dist/ui/DynamicProviderSelect/index.jsx +90 -0
  205. package/dist/ui/DynamicVoiceSelect/index.d.ts +7 -0
  206. package/dist/ui/DynamicVoiceSelect/index.js +156 -0
  207. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -0
  208. package/dist/ui/DynamicVoiceSelect/index.jsx +102 -0
  209. package/dist/ui/EncryptedTextField/index.d.ts +8 -0
  210. package/dist/ui/EncryptedTextField/index.js +74 -0
  211. package/dist/ui/EncryptedTextField/index.js.map +1 -0
  212. package/dist/ui/EncryptedTextField/index.jsx +35 -0
  213. package/dist/ui/Icons/LottieAnimation.js +3 -1
  214. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  215. package/dist/ui/Icons/LottieAnimation.jsx +2 -1
  216. package/dist/ui/ModelRowLabel/index.d.ts +6 -0
  217. package/dist/ui/ModelRowLabel/index.js +41 -0
  218. package/dist/ui/ModelRowLabel/index.js.map +1 -0
  219. package/dist/ui/ModelRowLabel/index.jsx +26 -0
  220. package/dist/ui/ProviderOptionsEditor/index.d.ts +7 -0
  221. package/dist/ui/ProviderOptionsEditor/index.js +291 -0
  222. package/dist/ui/ProviderOptionsEditor/index.js.map +1 -0
  223. package/dist/ui/ProviderOptionsEditor/index.jsx +210 -0
  224. package/dist/ui/VoicesFetcher/index.d.ts +7 -0
  225. package/dist/ui/VoicesFetcher/index.js +118 -0
  226. package/dist/ui/VoicesFetcher/index.js.map +1 -0
  227. package/dist/ui/VoicesFetcher/index.jsx +79 -0
  228. package/dist/utilities/buildSmartPrompt.d.ts +22 -0
  229. package/dist/utilities/buildSmartPrompt.js +143 -0
  230. package/dist/utilities/buildSmartPrompt.js.map +1 -0
  231. package/dist/utilities/encryption.d.ts +2 -0
  232. package/dist/utilities/encryption.js +47 -0
  233. package/dist/utilities/encryption.js.map +1 -0
  234. package/dist/utilities/extractImageData.d.ts +9 -0
  235. package/dist/utilities/extractImageData.js +12 -2
  236. package/dist/utilities/extractImageData.js.map +1 -1
  237. package/dist/utilities/fetchImages.d.ts +14 -0
  238. package/dist/utilities/fetchImages.js +38 -0
  239. package/dist/utilities/fetchImages.js.map +1 -0
  240. package/dist/utilities/fieldToJsonSchema.d.ts +2 -1
  241. package/dist/utilities/fieldToJsonSchema.js +66 -3
  242. package/dist/utilities/fieldToJsonSchema.js.map +1 -1
  243. package/dist/utilities/getFieldBySchemaPath.d.ts +2 -2
  244. package/dist/utilities/getFieldBySchemaPath.js +15 -0
  245. package/dist/utilities/getFieldBySchemaPath.js.map +1 -1
  246. package/dist/utilities/getProviderOptionsFields.d.ts +16 -0
  247. package/dist/utilities/getProviderOptionsFields.js +80 -0
  248. package/dist/utilities/getProviderOptionsFields.js.map +1 -0
  249. package/dist/utilities/isPluginActivated.js +1 -2
  250. package/dist/utilities/isPluginActivated.js.map +1 -1
  251. package/dist/utilities/lexicalToHTML.js.map +1 -1
  252. package/dist/utilities/resolveImageReferences.d.ts +30 -0
  253. package/dist/utilities/resolveImageReferences.js +167 -0
  254. package/dist/utilities/resolveImageReferences.js.map +1 -0
  255. package/dist/utilities/schemaConverter.d.ts +3 -0
  256. package/dist/utilities/schemaConverter.js +93 -0
  257. package/dist/utilities/schemaConverter.js.map +1 -0
  258. package/dist/utilities/setSafeLexicalState.d.ts +1 -3
  259. package/dist/utilities/setSafeLexicalState.js +1 -1
  260. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  261. package/dist/utilities/updateFieldsConfig.js +27 -43
  262. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  263. package/package.json +23 -24
  264. package/dist/ai/models/anthropic/index.d.ts +0 -2
  265. package/dist/ai/models/anthropic/index.js +0 -129
  266. package/dist/ai/models/anthropic/index.js.map +0 -1
  267. package/dist/ai/models/elevenLabs/generateVoice.d.ts +0 -8
  268. package/dist/ai/models/elevenLabs/generateVoice.js +0 -20
  269. package/dist/ai/models/elevenLabs/generateVoice.js.map +0 -1
  270. package/dist/ai/models/elevenLabs/index.d.ts +0 -2
  271. package/dist/ai/models/elevenLabs/index.js +0 -133
  272. package/dist/ai/models/elevenLabs/index.js.map +0 -1
  273. package/dist/ai/models/elevenLabs/voices.d.ts +0 -8
  274. package/dist/ai/models/elevenLabs/voices.js +0 -24
  275. package/dist/ai/models/elevenLabs/voices.js.map +0 -1
  276. package/dist/ai/models/generateObject.d.ts +0 -11
  277. package/dist/ai/models/generateObject.js +0 -22
  278. package/dist/ai/models/generateObject.js.map +0 -1
  279. package/dist/ai/models/google/generateImage.d.ts +0 -9
  280. package/dist/ai/models/google/generateImage.js +0 -27
  281. package/dist/ai/models/google/generateImage.js.map +0 -1
  282. package/dist/ai/models/google/index.d.ts +0 -2
  283. package/dist/ai/models/google/index.js +0 -201
  284. package/dist/ai/models/google/index.js.map +0 -1
  285. package/dist/ai/models/index.d.ts +0 -2
  286. package/dist/ai/models/index.js +0 -13
  287. package/dist/ai/models/index.js.map +0 -1
  288. package/dist/ai/models/openai/generateImage.d.ts +0 -5
  289. package/dist/ai/models/openai/generateImage.js +0 -31
  290. package/dist/ai/models/openai/generateImage.js.map +0 -1
  291. package/dist/ai/models/openai/generateVoice.d.ts +0 -6
  292. package/dist/ai/models/openai/generateVoice.js +0 -19
  293. package/dist/ai/models/openai/generateVoice.js.map +0 -1
  294. package/dist/ai/models/openai/index.d.ts +0 -2
  295. package/dist/ai/models/openai/index.js +0 -428
  296. package/dist/ai/models/openai/index.js.map +0 -1
  297. package/dist/ai/models/openai/openai.d.ts +0 -1
  298. package/dist/ai/models/openai/openai.js +0 -8
  299. package/dist/ai/models/openai/openai.js.map +0 -1
  300. package/dist/ai/utils/editImagesWithOpenAI.d.ts +0 -10
  301. package/dist/ai/utils/editImagesWithOpenAI.js +0 -37
  302. package/dist/ai/utils/editImagesWithOpenAI.js.map +0 -1
  303. package/dist/styles.d.js +0 -2
  304. package/dist/styles.d.js.map +0 -1
  305. package/dist/types/handlebars-async-helpers.d.js +0 -2
  306. package/dist/types/handlebars-async-helpers.d.js.map +0 -1
  307. package/dist/types/handlebars-dist-handlebars.d.js +0 -2
  308. package/dist/types/handlebars-dist-handlebars.d.js.map +0 -1
  309. package/dist/types/react-mentions.d.js +0 -2
  310. package/dist/types/react-mentions.d.js.map +0 -1
  311. package/dist/utilities/getGenerationModels.d.ts +0 -2
  312. package/dist/utilities/getGenerationModels.js +0 -10
  313. 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';
@@ -11,93 +11,122 @@ 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 })=>{
15
- const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({
16
- id: instructionId,
17
- collectionSlug: PLUGIN_INSTRUCTIONS_TABLE
18
- });
14
+ export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed })=>{
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
- className: `payloadai-compose__actions ${styles.actions}`,
167
+ className: `payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`,
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 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 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} ${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","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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"}
@@ -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';
@@ -10,105 +10,116 @@ 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 }) => {
14
- const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({
15
- id: instructionId,
16
- collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,
17
- });
13
+ export const Compose = ({ descriptionProps, forceVisible, instructionId, isConfigAllowed }) => {
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]);
130
- return (<label className={`payloadai-compose__actions ${styles.actions}`} onClick={(e) => e.preventDefault()} role="presentation">
131
- <DocumentDrawer onSave={() => {
132
- closeDrawer();
133
- }}/>
141
+ return (<Popup button={<PluginIcon isLoading={isAnyLoading}/>} render={popupRender} verticalAlign="bottom"/>);
142
+ }, [popupRender, isAnyLoading]);
143
+ return (<label className={`payloadai-compose__actions ${styles.actions} ${forceVisible ? styles.actionsVisible : ''}`} onClick={(e) => e.preventDefault()} role="presentation">
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"}