@ai-stack/payloadcms 3.76.0-beta.0 → 3.76.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 (349) hide show
  1. package/dist/ai/core/generateObject.js +1 -4
  2. package/dist/ai/core/generateObject.js.map +1 -1
  3. package/dist/ai/core/generateText.js +1 -5
  4. package/dist/ai/core/generateText.js.map +1 -1
  5. package/dist/ai/core/media/generateMedia.js +1 -4
  6. package/dist/ai/core/media/generateMedia.js.map +1 -1
  7. package/dist/ai/core/media/image/generateImage.js +4 -14
  8. package/dist/ai/core/media/image/generateImage.js.map +1 -1
  9. package/dist/ai/core/media/image/handlers/multimodal.js +21 -58
  10. package/dist/ai/core/media/image/handlers/multimodal.js.map +1 -1
  11. package/dist/ai/core/media/image/handlers/standard.js +17 -9
  12. package/dist/ai/core/media/image/handlers/standard.js.map +1 -1
  13. package/dist/ai/core/media/speech/generateSpeech.js +10 -11
  14. package/dist/ai/core/media/speech/generateSpeech.js.map +1 -1
  15. package/dist/ai/core/media/types.d.ts +3 -4
  16. package/dist/ai/core/media/types.js.map +1 -1
  17. package/dist/ai/core/streamObject.js +0 -3
  18. package/dist/ai/core/streamObject.js.map +1 -1
  19. package/dist/ai/core/streamText.js +1 -4
  20. package/dist/ai/core/streamText.js.map +1 -1
  21. package/dist/ai/core/types.d.ts +2 -2
  22. package/dist/ai/core/types.js.map +1 -1
  23. package/dist/ai/providers/blocks/anthropic.js +0 -42
  24. package/dist/ai/providers/blocks/anthropic.js.map +1 -1
  25. package/dist/ai/providers/blocks/elevenlabs.js +1 -106
  26. package/dist/ai/providers/blocks/elevenlabs.js.map +1 -1
  27. package/dist/ai/providers/blocks/fal.js +0 -118
  28. package/dist/ai/providers/blocks/fal.js.map +1 -1
  29. package/dist/ai/providers/blocks/google.js +2 -236
  30. package/dist/ai/providers/blocks/google.js.map +1 -1
  31. package/dist/ai/providers/blocks/openai-compatible.js +0 -144
  32. package/dist/ai/providers/blocks/openai-compatible.js.map +1 -1
  33. package/dist/ai/providers/blocks/openai.js +0 -200
  34. package/dist/ai/providers/blocks/openai.js.map +1 -1
  35. package/dist/ai/providers/blocks/xai.js +0 -53
  36. package/dist/ai/providers/blocks/xai.js.map +1 -1
  37. package/dist/ai/providers/index.d.ts +1 -1
  38. package/dist/ai/providers/index.js +0 -2
  39. package/dist/ai/providers/index.js.map +1 -1
  40. package/dist/ai/providers/registry.d.ts +24 -28
  41. package/dist/ai/providers/registry.js +186 -140
  42. package/dist/ai/providers/registry.js.map +1 -1
  43. package/dist/ai/providers/types.d.ts +12 -33
  44. package/dist/ai/providers/types.js +0 -1
  45. package/dist/ai/providers/types.js.map +1 -1
  46. package/dist/ai/schemas/lexicalJsonSchema.js +1 -1
  47. package/dist/ai/schemas/lexicalJsonSchema.js.map +1 -1
  48. package/dist/ai/utilities/filterEditorSchemaByNodes.js.map +1 -0
  49. package/dist/ai/utilities/generateFileNameByPrompt.js.map +1 -0
  50. package/dist/ai/utilities/isObjectSchema.js.map +1 -0
  51. package/dist/ai/utilities/nodeToSchemaMap.js.map +1 -0
  52. package/dist/ai/{prompts.d.ts → utilities/prompts.d.ts} +1 -1
  53. package/dist/ai/utilities/prompts.js.map +1 -0
  54. package/dist/ai/utilities/systemGenerate.js.map +1 -0
  55. package/dist/collections/AIJobs.js +3 -12
  56. package/dist/collections/AIJobs.js.map +1 -1
  57. package/dist/collections/AIProviders.d.ts +2 -0
  58. package/dist/collections/{AISettings.js → AIProviders.js} +54 -26
  59. package/dist/collections/AIProviders.js.map +1 -0
  60. package/dist/collections/Instructions.js +93 -57
  61. package/dist/collections/Instructions.js.map +1 -1
  62. package/dist/collections/shared.d.ts +30 -0
  63. package/dist/collections/shared.js +15 -0
  64. package/dist/collections/shared.js.map +1 -0
  65. package/dist/defaults.js +1 -1
  66. package/dist/defaults.js.map +1 -1
  67. package/dist/endpoints/fetchFields.js +15 -7
  68. package/dist/endpoints/fetchFields.js.map +1 -1
  69. package/dist/endpoints/fetchVoices.js +2 -2
  70. package/dist/endpoints/fetchVoices.js.map +1 -1
  71. package/dist/endpoints/generate.d.ts +7 -0
  72. package/dist/endpoints/generate.js +268 -0
  73. package/dist/endpoints/generate.js.map +1 -0
  74. package/dist/endpoints/index.js +9 -604
  75. package/dist/endpoints/index.js.map +1 -1
  76. package/dist/endpoints/promptMentions.d.ts +2 -0
  77. package/dist/endpoints/promptMentions.js +166 -0
  78. package/dist/endpoints/promptMentions.js.map +1 -0
  79. package/dist/endpoints/upload.d.ts +7 -0
  80. package/dist/endpoints/upload.js +294 -0
  81. package/dist/endpoints/upload.js.map +1 -0
  82. package/dist/endpoints/videogenWebhook.d.ts +7 -0
  83. package/dist/endpoints/videogenWebhook.js +132 -0
  84. package/dist/endpoints/videogenWebhook.js.map +1 -0
  85. package/dist/exports/client.d.ts +3 -2
  86. package/dist/exports/client.js +3 -2
  87. package/dist/exports/client.js.map +1 -1
  88. package/dist/exports/fields.d.ts +2 -1
  89. package/dist/exports/fields.js +2 -1
  90. package/dist/exports/fields.js.map +1 -1
  91. package/dist/fields/ArrayComposeField/ArrayComposeField.js +1 -1
  92. package/dist/fields/ArrayComposeField/ArrayComposeField.js.map +1 -1
  93. package/dist/fields/ArrayComposeField/ArrayComposeField.jsx +1 -1
  94. package/dist/fields/ComposeField/ComposeField.d.ts +1 -0
  95. package/dist/fields/ComposeField/ComposeField.js +18 -8
  96. package/dist/fields/ComposeField/ComposeField.js.map +1 -1
  97. package/dist/fields/ComposeField/ComposeField.jsx +12 -7
  98. package/dist/fields/PromptEditorField/feature.client.d.ts +1 -0
  99. package/dist/fields/PromptEditorField/feature.client.js +173 -0
  100. package/dist/fields/PromptEditorField/feature.client.js.map +1 -0
  101. package/dist/fields/PromptEditorField/feature.client.jsx +148 -0
  102. package/dist/fields/PromptEditorField/feature.server.d.ts +1 -0
  103. package/dist/fields/PromptEditorField/feature.server.js +30 -0
  104. package/dist/fields/PromptEditorField/feature.server.js.map +1 -0
  105. package/dist/fields/PromptField.d.ts +4 -0
  106. package/dist/fields/PromptField.js +18 -0
  107. package/dist/fields/PromptField.js.map +1 -0
  108. package/dist/fields/SelectField/SelectField.js +0 -1
  109. package/dist/fields/SelectField/SelectField.js.map +1 -1
  110. package/dist/fields/SelectField/SelectField.jsx +0 -1
  111. package/dist/index.d.ts +4 -3
  112. package/dist/index.js +4 -2
  113. package/dist/index.js.map +1 -1
  114. package/dist/libraries/handlebars/helpers.js +2 -2
  115. package/dist/libraries/handlebars/helpers.js.map +1 -1
  116. package/dist/libraries/handlebars/replacePlaceholders.js +5 -1
  117. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -1
  118. package/dist/payload-ai.d.ts +5 -19
  119. package/dist/plugin.js +19 -22
  120. package/dist/plugin.js.map +1 -1
  121. package/dist/providers/FieldProvider/FieldProvider.js +10 -19
  122. package/dist/providers/FieldProvider/FieldProvider.js.map +1 -1
  123. package/dist/providers/FieldProvider/FieldProvider.jsx +7 -17
  124. package/dist/providers/InstructionsProvider/InstructionsProvider.js +4 -1
  125. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -1
  126. package/dist/providers/InstructionsProvider/InstructionsProvider.jsx +3 -0
  127. package/dist/providers/InstructionsProvider/useInstructions.js +1 -1
  128. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -1
  129. package/dist/translations/de.json +47 -0
  130. package/dist/translations/en.json +45 -2
  131. package/dist/translations/es.json +45 -2
  132. package/dist/translations/fa.json +45 -2
  133. package/dist/translations/fr.json +46 -3
  134. package/dist/translations/hi.json +47 -0
  135. package/dist/translations/index.d.ts +88 -26
  136. package/dist/translations/index.js +18 -32
  137. package/dist/translations/index.js.map +1 -1
  138. package/dist/translations/ja.json +47 -0
  139. package/dist/translations/nb.json +47 -0
  140. package/dist/translations/nl.json +47 -0
  141. package/dist/translations/pl.json +45 -2
  142. package/dist/translations/pt.json +47 -0
  143. package/dist/translations/ru.json +45 -2
  144. package/dist/translations/th.json +47 -0
  145. package/dist/translations/translation-schema.json +184 -11
  146. package/dist/translations/uk.json +45 -2
  147. package/dist/translations/zh.json +47 -0
  148. package/dist/types.d.ts +57 -31
  149. package/dist/types.js.map +1 -1
  150. package/dist/ui/Compose/Compose.js +42 -79
  151. package/dist/ui/Compose/Compose.js.map +1 -1
  152. package/dist/ui/Compose/Compose.jsx +32 -86
  153. package/dist/ui/Compose/ComposePlaceholder.js +1 -1
  154. package/dist/ui/Compose/ComposePlaceholder.js.map +1 -1
  155. package/dist/ui/Compose/ComposePlaceholder.jsx +1 -1
  156. package/dist/ui/Compose/{compose.module.css → compose.module.scss} +3 -5
  157. package/dist/ui/Compose/hooks/menu/Item.d.ts +1 -1
  158. package/dist/ui/Compose/hooks/menu/Item.js +7 -3
  159. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -1
  160. package/dist/ui/Compose/hooks/menu/Item.jsx +11 -5
  161. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts +5 -0
  162. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +48 -5
  163. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -1
  164. package/dist/ui/Compose/hooks/menu/TranslateMenu.jsx +44 -6
  165. package/dist/ui/Compose/hooks/menu/items.d.ts +8 -8
  166. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +2 -1
  167. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -1
  168. package/dist/ui/Compose/hooks/menu/menu.module.scss +4 -1
  169. package/dist/ui/Compose/hooks/menu/types.d.ts +21 -0
  170. package/dist/ui/Compose/hooks/menu/types.js +3 -0
  171. package/dist/ui/Compose/hooks/menu/types.js.map +1 -0
  172. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +2 -2
  173. package/dist/ui/Compose/hooks/menu/useMenu.js +45 -23
  174. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -1
  175. package/dist/ui/Compose/hooks/menu/useMenu.jsx +43 -23
  176. package/dist/ui/Compose/hooks/mergeGeneratedValue.d.ts +14 -0
  177. package/dist/ui/Compose/hooks/mergeGeneratedValue.js +38 -0
  178. package/dist/ui/Compose/hooks/mergeGeneratedValue.js.map +1 -0
  179. package/dist/ui/Compose/hooks/useActiveFieldTracking.js +34 -0
  180. package/dist/ui/Compose/hooks/useActiveFieldTracking.js.map +1 -1
  181. package/dist/ui/Compose/hooks/useGenerate.js +37 -12
  182. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -1
  183. package/dist/ui/Compose/hooks/useGenerateUpload.js +67 -19
  184. package/dist/ui/Compose/hooks/useGenerateUpload.js.map +1 -1
  185. package/dist/ui/Compose/hooks/useStreamingUpdate.js +4 -4
  186. package/dist/ui/Compose/hooks/useStreamingUpdate.js.map +1 -1
  187. package/dist/ui/ConfigDashboard/configDashboard.module.css +94 -0
  188. package/dist/ui/ConfigDashboard/index.d.ts +2 -0
  189. package/dist/ui/ConfigDashboard/index.js +159 -0
  190. package/dist/ui/ConfigDashboard/index.js.map +1 -0
  191. package/dist/ui/ConfigDashboard/index.jsx +122 -0
  192. package/dist/ui/DynamicModelSelect/index.js +6 -27
  193. package/dist/ui/DynamicModelSelect/index.js.map +1 -1
  194. package/dist/ui/DynamicModelSelect/index.jsx +6 -29
  195. package/dist/ui/DynamicProviderSelect/index.js +6 -27
  196. package/dist/ui/DynamicProviderSelect/index.js.map +1 -1
  197. package/dist/ui/DynamicProviderSelect/index.jsx +6 -29
  198. package/dist/ui/DynamicVoiceSelect/index.js +34 -83
  199. package/dist/ui/DynamicVoiceSelect/index.js.map +1 -1
  200. package/dist/ui/DynamicVoiceSelect/index.jsx +16 -53
  201. package/dist/ui/GlobalProviderOptions/index.d.ts +2 -0
  202. package/dist/ui/GlobalProviderOptions/index.js +118 -0
  203. package/dist/ui/GlobalProviderOptions/index.js.map +1 -0
  204. package/dist/ui/GlobalProviderOptions/index.jsx +60 -0
  205. package/dist/ui/Icons/Icons.js +1 -1
  206. package/dist/ui/Icons/Icons.js.map +1 -1
  207. package/dist/ui/Icons/Icons.jsx +1 -1
  208. package/dist/ui/Icons/LottieAnimation.js +1 -1
  209. package/dist/ui/Icons/LottieAnimation.js.map +1 -1
  210. package/dist/ui/Icons/LottieAnimation.jsx +1 -1
  211. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.d.ts +12 -0
  212. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js +166 -0
  213. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.js.map +1 -0
  214. package/dist/ui/InstructionProviderOptions/ProviderOptionsTree.jsx +83 -0
  215. package/dist/ui/InstructionProviderOptions/index.d.ts +2 -0
  216. package/dist/ui/InstructionProviderOptions/index.js +157 -0
  217. package/dist/ui/InstructionProviderOptions/index.js.map +1 -0
  218. package/dist/ui/InstructionProviderOptions/index.jsx +92 -0
  219. package/dist/ui/VoicesFetcher/index.js.map +1 -1
  220. package/dist/ui/hooks/useAISettings.d.ts +26 -0
  221. package/dist/ui/hooks/useAISettings.js +73 -0
  222. package/dist/ui/hooks/useAISettings.js.map +1 -0
  223. package/dist/ui/providerOptions/updateProviderOptionsValue.d.ts +6 -0
  224. package/dist/ui/providerOptions/updateProviderOptionsValue.js +50 -0
  225. package/dist/ui/providerOptions/updateProviderOptionsValue.js.map +1 -0
  226. package/dist/ui/shared/handleSelectChange.d.ts +5 -0
  227. package/dist/ui/shared/handleSelectChange.js +12 -0
  228. package/dist/ui/shared/handleSelectChange.js.map +1 -0
  229. package/dist/ui/shared/types.d.ts +11 -0
  230. package/dist/ui/shared/types.js +5 -0
  231. package/dist/ui/shared/types.js.map +1 -0
  232. package/dist/utilities/ai/resolveEffectiveInstructionSettings.d.ts +15 -0
  233. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js +136 -0
  234. package/dist/utilities/ai/resolveEffectiveInstructionSettings.js.map +1 -0
  235. package/dist/{endpoints → utilities}/buildPromptUtils.js +14 -5
  236. package/dist/utilities/buildPromptUtils.js.map +1 -0
  237. package/dist/utilities/buildSmartPrompt.js +3 -3
  238. package/dist/utilities/buildSmartPrompt.js.map +1 -1
  239. package/dist/utilities/fields/fieldToJsonSchema.js.map +1 -0
  240. package/dist/utilities/fields/getFieldBySchemaPath.js.map +1 -0
  241. package/dist/utilities/fields/getFieldInfo.js.map +1 -0
  242. package/dist/utilities/{updateFieldsConfig.js → fields/updateFieldsConfig.js} +8 -3
  243. package/dist/utilities/fields/updateFieldsConfig.js.map +1 -0
  244. package/dist/utilities/images/extractImageData.js.map +1 -0
  245. package/dist/utilities/images/extractPromptAttachments.js.map +1 -0
  246. package/dist/utilities/{fetchImages.d.ts → images/fetchImages.d.ts} +1 -1
  247. package/dist/utilities/images/fetchImages.js +49 -0
  248. package/dist/utilities/images/fetchImages.js.map +1 -0
  249. package/dist/utilities/images/resolveImageReferences.js +183 -0
  250. package/dist/utilities/images/resolveImageReferences.js.map +1 -0
  251. package/dist/utilities/init/autoSetupProviders.d.ts +3 -0
  252. package/dist/utilities/init/autoSetupProviders.js +216 -0
  253. package/dist/utilities/init/autoSetupProviders.js.map +1 -0
  254. package/dist/utilities/lexical/editorSchemaValidator.js.map +1 -0
  255. package/dist/utilities/lexical/lexicalToHTML.js.map +1 -0
  256. package/dist/utilities/lexical/lexicalToPromptTemplate.d.ts +2 -0
  257. package/dist/utilities/lexical/lexicalToPromptTemplate.js +50 -0
  258. package/dist/utilities/lexical/lexicalToPromptTemplate.js.map +1 -0
  259. package/dist/utilities/lexical/setSafeLexicalState.js.map +1 -0
  260. package/dist/utilities/lexical/stringToLexicalJSON.d.ts +2 -0
  261. package/dist/utilities/lexical/stringToLexicalJSON.js +39 -0
  262. package/dist/utilities/lexical/stringToLexicalJSON.js.map +1 -0
  263. package/dist/utilities/sanitizeLog.d.ts +1 -0
  264. package/dist/utilities/sanitizeLog.js +39 -0
  265. package/dist/utilities/sanitizeLog.js.map +1 -0
  266. package/dist/utilities/seedProperties.js +37 -22
  267. package/dist/utilities/seedProperties.js.map +1 -1
  268. package/package.json +5 -2
  269. package/dist/ai/analyse.d.ts +0 -1
  270. package/dist/ai/analyse.js +0 -3
  271. package/dist/ai/analyse.js.map +0 -1
  272. package/dist/ai/index.d.ts +0 -11
  273. package/dist/ai/index.js +0 -25
  274. package/dist/ai/index.js.map +0 -1
  275. package/dist/ai/prompts.js.map +0 -1
  276. package/dist/ai/utils/filterEditorSchemaByNodes.js.map +0 -1
  277. package/dist/ai/utils/generateFileNameByPrompt.js.map +0 -1
  278. package/dist/ai/utils/isObjectSchema.js.map +0 -1
  279. package/dist/ai/utils/nodeToSchemaMap.js.map +0 -1
  280. package/dist/ai/utils/systemGenerate.js.map +0 -1
  281. package/dist/collections/AISettings.d.ts +0 -2
  282. package/dist/collections/AISettings.js.map +0 -1
  283. package/dist/endpoints/buildPromptUtils.js.map +0 -1
  284. package/dist/endpoints/chat.d.ts +0 -4
  285. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +0 -3
  286. package/dist/fields/PromptEditorField/PromptEditorField.js +0 -217
  287. package/dist/fields/PromptEditorField/PromptEditorField.js.map +0 -1
  288. package/dist/fields/PromptEditorField/PromptEditorField.jsx +0 -160
  289. package/dist/ui/AIConfigDashboard/index.d.ts +0 -2
  290. package/dist/ui/AIConfigDashboard/index.js +0 -222
  291. package/dist/ui/AIConfigDashboard/index.js.map +0 -1
  292. package/dist/ui/AIConfigDashboard/index.jsx +0 -170
  293. package/dist/ui/ProviderOptionsEditor/index.d.ts +0 -7
  294. package/dist/ui/ProviderOptionsEditor/index.js +0 -291
  295. package/dist/ui/ProviderOptionsEditor/index.js.map +0 -1
  296. package/dist/ui/ProviderOptionsEditor/index.jsx +0 -210
  297. package/dist/utilities/editorSchemaValidator.js.map +0 -1
  298. package/dist/utilities/extractImageData.js.map +0 -1
  299. package/dist/utilities/extractPromptAttachments.js.map +0 -1
  300. package/dist/utilities/fetchImages.js +0 -38
  301. package/dist/utilities/fetchImages.js.map +0 -1
  302. package/dist/utilities/fieldToJsonSchema.js.map +0 -1
  303. package/dist/utilities/getFieldBySchemaPath.js.map +0 -1
  304. package/dist/utilities/getFieldInfo.js.map +0 -1
  305. package/dist/utilities/getProviderOptionsFields.d.ts +0 -16
  306. package/dist/utilities/getProviderOptionsFields.js +0 -80
  307. package/dist/utilities/getProviderOptionsFields.js.map +0 -1
  308. package/dist/utilities/isPluginActivated.d.ts +0 -2
  309. package/dist/utilities/isPluginActivated.js +0 -5
  310. package/dist/utilities/isPluginActivated.js.map +0 -1
  311. package/dist/utilities/lexicalToHTML.js.map +0 -1
  312. package/dist/utilities/resolveImageReferences.js +0 -167
  313. package/dist/utilities/resolveImageReferences.js.map +0 -1
  314. package/dist/utilities/schemaConverter.d.ts +0 -3
  315. package/dist/utilities/schemaConverter.js +0 -93
  316. package/dist/utilities/schemaConverter.js.map +0 -1
  317. package/dist/utilities/setSafeLexicalState.js.map +0 -1
  318. package/dist/utilities/updateFieldsConfig.js.map +0 -1
  319. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.d.ts +0 -0
  320. /package/dist/ai/{utils → utilities}/filterEditorSchemaByNodes.js +0 -0
  321. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.d.ts +0 -0
  322. /package/dist/ai/{utils → utilities}/generateFileNameByPrompt.js +0 -0
  323. /package/dist/ai/{utils → utilities}/isObjectSchema.d.ts +0 -0
  324. /package/dist/ai/{utils → utilities}/isObjectSchema.js +0 -0
  325. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.d.ts +0 -0
  326. /package/dist/ai/{utils → utilities}/nodeToSchemaMap.js +0 -0
  327. /package/dist/ai/{prompts.js → utilities/prompts.js} +0 -0
  328. /package/dist/ai/{utils → utilities}/systemGenerate.d.ts +0 -0
  329. /package/dist/ai/{utils → utilities}/systemGenerate.js +0 -0
  330. /package/dist/ui/Icons/{icons.module.css → icons.module.scss} +0 -0
  331. /package/dist/{endpoints → utilities}/buildPromptUtils.d.ts +0 -0
  332. /package/dist/utilities/{fieldToJsonSchema.d.ts → fields/fieldToJsonSchema.d.ts} +0 -0
  333. /package/dist/utilities/{fieldToJsonSchema.js → fields/fieldToJsonSchema.js} +0 -0
  334. /package/dist/utilities/{getFieldBySchemaPath.d.ts → fields/getFieldBySchemaPath.d.ts} +0 -0
  335. /package/dist/utilities/{getFieldBySchemaPath.js → fields/getFieldBySchemaPath.js} +0 -0
  336. /package/dist/utilities/{getFieldInfo.d.ts → fields/getFieldInfo.d.ts} +0 -0
  337. /package/dist/utilities/{getFieldInfo.js → fields/getFieldInfo.js} +0 -0
  338. /package/dist/utilities/{updateFieldsConfig.d.ts → fields/updateFieldsConfig.d.ts} +0 -0
  339. /package/dist/utilities/{extractImageData.d.ts → images/extractImageData.d.ts} +0 -0
  340. /package/dist/utilities/{extractImageData.js → images/extractImageData.js} +0 -0
  341. /package/dist/utilities/{extractPromptAttachments.d.ts → images/extractPromptAttachments.d.ts} +0 -0
  342. /package/dist/utilities/{extractPromptAttachments.js → images/extractPromptAttachments.js} +0 -0
  343. /package/dist/utilities/{resolveImageReferences.d.ts → images/resolveImageReferences.d.ts} +0 -0
  344. /package/dist/utilities/{editorSchemaValidator.d.ts → lexical/editorSchemaValidator.d.ts} +0 -0
  345. /package/dist/utilities/{editorSchemaValidator.js → lexical/editorSchemaValidator.js} +0 -0
  346. /package/dist/utilities/{lexicalToHTML.d.ts → lexical/lexicalToHTML.d.ts} +0 -0
  347. /package/dist/utilities/{lexicalToHTML.js → lexical/lexicalToHTML.js} +0 -0
  348. /package/dist/utilities/{setSafeLexicalState.d.ts → lexical/setSafeLexicalState.d.ts} +0 -0
  349. /package/dist/utilities/{setSafeLexicalState.js → lexical/setSafeLexicalState.js} +0 -0
@@ -5,7 +5,9 @@ import { jsonSchema } from 'ai';
5
5
  import { useCallback, useEffect, useRef } from 'react';
6
6
  import { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js';
7
7
  import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
8
- import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
8
+ import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
9
+ import { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js';
10
+ import { mergeGeneratedValue } from './mergeGeneratedValue.js';
9
11
  import { useGenerateUpload } from './useGenerateUpload.js';
10
12
  import { useHistory } from './useHistory.js';
11
13
  import { useStreamingUpdate } from './useStreamingUpdate.js';
@@ -18,15 +20,30 @@ export const useGenerate = ({ instructionId })=>{
18
20
  }, [
19
21
  instructionId
20
22
  ]);
21
- const { field, path: pathFromContext } = useFieldProps();
23
+ const { field, path: pathFromContext, schemaPath } = useFieldProps();
24
+ const { appendGenerated } = useInstructions({
25
+ schemaPath
26
+ });
22
27
  const editorConfigContext = useEditorConfigContext();
23
- const { setValue } = useField({
28
+ const { setValue, value: currentFieldValue } = useField({
24
29
  path: pathFromContext ?? ''
25
30
  });
31
+ const appendGeneratedRef = useRef(!!appendGenerated);
32
+ const currentFieldValueRef = useRef(currentFieldValue);
26
33
  const { set: setHistory } = useHistory();
27
34
  const { getData } = useForm();
28
35
  const { id: documentId } = useDocumentInfo();
29
- const localFromContext = useLocale();
36
+ const locale = useLocale();
37
+ useEffect(()=>{
38
+ appendGeneratedRef.current = !!appendGenerated;
39
+ }, [
40
+ appendGenerated
41
+ ]);
42
+ useEffect(()=>{
43
+ currentFieldValueRef.current = currentFieldValue;
44
+ }, [
45
+ currentFieldValue
46
+ ]);
30
47
  const { isLoading: loadingObject, object, stop: objectStop, submit } = useObject({
31
48
  api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
32
49
  onError: (error)=>{
@@ -38,12 +55,21 @@ export const useGenerate = ({ instructionId })=>{
38
55
  if (field.type === 'richText') {
39
56
  setHistory(result.object);
40
57
  setSafeLexicalState(result.object, editor);
41
- } else if ('name' in field && result.object[field.name]) {
42
- setHistory(result.object[field.name]);
43
- setValue(result.object[field.name]);
58
+ } else if ('name' in field && result.object[field.name] !== undefined) {
59
+ const merged = mergeGeneratedValue({
60
+ appendGenerated: appendGeneratedRef.current,
61
+ currentValue: currentFieldValueRef.current,
62
+ generatedValue: result.object[field.name],
63
+ hasMany: field.hasMany === true,
64
+ max: typeof field.max === 'number' ? field.max : undefined,
65
+ maxRows: typeof field.maxRows === 'number' ? field.maxRows : undefined
66
+ });
67
+ if (merged.truncated) {
68
+ toast.info('Appended values were truncated to this field maximum.');
69
+ }
70
+ setHistory(merged.value);
71
+ setValue(merged.value);
44
72
  }
45
- } else {
46
- console.log('onFinish: result, field ', result, field);
47
73
  }
48
74
  },
49
75
  schema: jsonSchema({
@@ -77,11 +103,11 @@ export const useGenerate = ({ instructionId })=>{
77
103
  ...doc,
78
104
  id: documentId
79
105
  },
80
- locale: localFromContext?.code,
106
+ locale: locale?.code,
81
107
  options
82
108
  });
83
109
  }, [
84
- localFromContext?.code,
110
+ locale?.code,
85
111
  instructionIdRef,
86
112
  documentId,
87
113
  getData,
@@ -102,7 +128,6 @@ export const useGenerate = ({ instructionId })=>{
102
128
  field
103
129
  ]);
104
130
  const stop = useCallback(()=>{
105
- console.log('Stopping...');
106
131
  objectStop();
107
132
  }, [
108
133
  objectStop
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ActionMenuItems } from '../../../types.js'\n\nimport { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useGenerateUpload } from './useGenerateUpload.js'\nimport { useHistory } from './useHistory.js'\nimport { useStreamingUpdate } from './useStreamingUpdate.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\n const { field, path: pathFromContext } = useFieldProps()\n const editorConfigContext = useEditorConfigContext()\n const { setValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n const { set: setHistory } = useHistory()\n const { getData } = useForm()\n const { id: documentId } = useDocumentInfo()\n const localFromContext = useLocale()\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error: any) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object && field) {\n if (field.type === 'richText') {\n setHistory(result.object)\n setSafeLexicalState(result.object, editor)\n } else if ('name' in field && result.object[field.name]) {\n setHistory(result.object[field.name])\n setValue(result.object[field.name])\n }\n } else {\n console.log('onFinish: result, field ', result, field)\n }\n },\n schema: jsonSchema({\n type: 'object',\n additionalProperties: true,\n properties: {},\n }) as any,\n })\n\n const { editor } = editorConfigContext\n\n // Hook: Handle high-frequency streaming updates\n useStreamingUpdate({\n editor,\n isLoading: loadingObject,\n object,\n })\n\n // Hook 2: Handle Upload generation and polling\n const { generateUpload, isJobActive, jobProgress, jobStatus } = useGenerateUpload({\n instructionIdRef,\n })\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc: {\n ...doc,\n id: documentId,\n },\n locale: localFromContext?.code,\n options,\n })\n },\n [localFromContext?.code, instructionIdRef, documentId, getData, submit, editor],\n )\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if ((field as any)?.type === 'upload') {\n return generateUpload()\n }\n // All supported types use structured object generation when schema is provided server-side\n return streamObject(options ?? { action: 'Compose' })\n },\n [generateUpload, streamObject, field],\n )\n\n const stop = useCallback(() => {\n console.log('Stopping...')\n objectStop()\n }, [objectStop])\n\n return {\n generate,\n isJobActive,\n isLoading: loadingObject,\n jobProgress,\n jobStatus,\n stop,\n }\n}\n"],"names":["experimental_useObject","useObject","useEditorConfigContext","toast","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useRef","PLUGIN_API_ENDPOINT_GENERATE","useFieldProps","setSafeLexicalState","useGenerateUpload","useHistory","useStreamingUpdate","useGenerate","instructionId","instructionIdRef","current","field","path","pathFromContext","editorConfigContext","setValue","set","setHistory","getData","id","documentId","localFromContext","isLoading","loadingObject","object","stop","objectStop","submit","api","onError","error","message","console","onFinish","result","type","editor","name","log","schema","additionalProperties","properties","generateUpload","isJobActive","jobProgress","jobStatus","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","locale","code","generate"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import { experimental_useObject as useObject } from '@ai-sdk/react'\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { toast, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { jsonSchema } from 'ai'\nimport { useCallback, useEffect, useRef } from 'react'\n\nimport type { ActionMenuItems } from '../../../types.js'\n\nimport { PLUGIN_API_ENDPOINT_GENERATE } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js'\nimport { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js'\nimport { mergeGeneratedValue } from './mergeGeneratedValue.js'\nimport { useGenerateUpload } from './useGenerateUpload.js'\nimport { useHistory } from './useHistory.js'\nimport { useStreamingUpdate } from './useStreamingUpdate.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\nexport const useGenerate = ({ instructionId }: { instructionId: string }) => {\n // Create a ref to hold the current instructionId\n const instructionIdRef = useRef(instructionId)\n\n // Update the ref whenever instructionId changes\n useEffect(() => {\n instructionIdRef.current = instructionId\n }, [instructionId])\n\n const { field, path: pathFromContext, schemaPath } = useFieldProps()\n const { appendGenerated } = useInstructions({ schemaPath })\n const editorConfigContext = useEditorConfigContext()\n const { setValue, value: currentFieldValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n const appendGeneratedRef = useRef(!!appendGenerated)\n const currentFieldValueRef = useRef(currentFieldValue)\n const { set: setHistory } = useHistory()\n const { getData } = useForm()\n const { id: documentId } = useDocumentInfo()\n const locale = useLocale()\n\n useEffect(() => {\n appendGeneratedRef.current = !!appendGenerated\n }, [appendGenerated])\n\n useEffect(() => {\n currentFieldValueRef.current = currentFieldValue\n }, [currentFieldValue])\n\n const {\n isLoading: loadingObject,\n object,\n stop: objectStop,\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error: any) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object && field) {\n if (field.type === 'richText') {\n setHistory(result.object)\n setSafeLexicalState(result.object, editor)\n } else if ('name' in field && result.object[field.name] !== undefined) {\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue: result.object[field.name],\n hasMany: (field as any).hasMany === true,\n max: typeof (field as any).max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any).maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setHistory(merged.value)\n setValue(merged.value)\n }\n }\n },\n schema: jsonSchema({\n type: 'object',\n additionalProperties: true,\n properties: {},\n }) as any,\n })\n\n const { editor } = editorConfigContext\n\n // Hook: Handle high-frequency streaming updates\n useStreamingUpdate({\n editor,\n isLoading: loadingObject,\n object,\n })\n\n // Hook 2: Handle Upload generation and polling\n const { generateUpload, isJobActive, jobProgress, jobStatus } = useGenerateUpload({\n instructionIdRef,\n })\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const currentInstructionId = instructionIdRef.current\n\n const options = {\n action,\n actionParams: params,\n instructionId: currentInstructionId,\n }\n\n submit({\n allowedEditorNodes: Array.from(editor?._nodes?.keys() || []),\n doc: {\n ...doc,\n id: documentId,\n },\n locale: locale?.code,\n options,\n })\n },\n [locale?.code, instructionIdRef, documentId, getData, submit, editor],\n )\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if ((field as any)?.type === 'upload') {\n return generateUpload()\n }\n // All supported types use structured object generation when schema is provided server-side\n return streamObject(options ?? { action: 'Compose' })\n },\n [generateUpload, streamObject, field],\n )\n\n const stop = useCallback(() => {\n objectStop()\n }, [objectStop])\n\n return {\n generate,\n isJobActive,\n isLoading: loadingObject,\n jobProgress,\n jobStatus,\n stop,\n }\n}\n"],"names":["experimental_useObject","useObject","useEditorConfigContext","toast","useDocumentInfo","useField","useForm","useLocale","jsonSchema","useCallback","useEffect","useRef","PLUGIN_API_ENDPOINT_GENERATE","useFieldProps","useInstructions","setSafeLexicalState","mergeGeneratedValue","useGenerateUpload","useHistory","useStreamingUpdate","useGenerate","instructionId","instructionIdRef","current","field","path","pathFromContext","schemaPath","appendGenerated","editorConfigContext","setValue","value","currentFieldValue","appendGeneratedRef","currentFieldValueRef","set","setHistory","getData","id","documentId","locale","isLoading","loadingObject","object","stop","objectStop","submit","api","onError","error","message","console","onFinish","result","type","editor","name","undefined","merged","currentValue","generatedValue","hasMany","max","maxRows","truncated","info","schema","additionalProperties","properties","generateUpload","isJobActive","jobProgress","jobStatus","streamObject","action","params","doc","currentInstructionId","options","actionParams","allowedEditorNodes","Array","from","_nodes","keys","code","generate"],"mappings":"AAAA,SAASA,0BAA0BC,SAAS,QAAQ,gBAAe;AACnE,SAASC,sBAAsB,QAAQ,sCAAqC;AAC5E,SAASC,KAAK,EAAEC,eAAe,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,SAAS,QAAQ,iBAAgB;AACrF,SAASC,UAAU,QAAQ,KAAI;AAC/B,SAASC,WAAW,EAAEC,SAAS,EAAEC,MAAM,QAAQ,QAAO;AAItD,SAASC,4BAA4B,QAAQ,uBAAsB;AACnE,SAASC,aAAa,QAAQ,oDAAmD;AACjF,SAASC,eAAe,QAAQ,6DAA4D;AAC5F,SAASC,mBAAmB,QAAQ,oDAAmD;AACvF,SAASC,mBAAmB,QAAQ,2BAA0B;AAC9D,SAASC,iBAAiB,QAAQ,yBAAwB;AAC1D,SAASC,UAAU,QAAQ,kBAAiB;AAC5C,SAASC,kBAAkB,QAAQ,0BAAyB;AAI5D,OAAO,MAAMC,cAAc,CAAC,EAAEC,aAAa,EAA6B;IACtE,iDAAiD;IACjD,MAAMC,mBAAmBX,OAAOU;IAEhC,gDAAgD;IAChDX,UAAU;QACRY,iBAAiBC,OAAO,GAAGF;IAC7B,GAAG;QAACA;KAAc;IAElB,MAAM,EAAEG,KAAK,EAAEC,MAAMC,eAAe,EAAEC,UAAU,EAAE,GAAGd;IACrD,MAAM,EAAEe,eAAe,EAAE,GAAGd,gBAAgB;QAAEa;IAAW;IACzD,MAAME,sBAAsB3B;IAC5B,MAAM,EAAE4B,QAAQ,EAAEC,OAAOC,iBAAiB,EAAE,GAAG3B,SAAc;QAC3DoB,MAAMC,mBAAmB;IAC3B;IACA,MAAMO,qBAAqBtB,OAAO,CAAC,CAACiB;IACpC,MAAMM,uBAAuBvB,OAAOqB;IACpC,MAAM,EAAEG,KAAKC,UAAU,EAAE,GAAGlB;IAC5B,MAAM,EAAEmB,OAAO,EAAE,GAAG/B;IACpB,MAAM,EAAEgC,IAAIC,UAAU,EAAE,GAAGnC;IAC3B,MAAMoC,SAASjC;IAEfG,UAAU;QACRuB,mBAAmBV,OAAO,GAAG,CAAC,CAACK;IACjC,GAAG;QAACA;KAAgB;IAEpBlB,UAAU;QACRwB,qBAAqBX,OAAO,GAAGS;IACjC,GAAG;QAACA;KAAkB;IAEtB,MAAM,EACJS,WAAWC,aAAa,EACxBC,MAAM,EACNC,MAAMC,UAAU,EAChBC,MAAM,EACP,GAAG7C,UAAU;QACZ8C,KAAK,CAAC,IAAI,EAAEnC,6BAA6B,CAAC;QAC1CoC,SAAS,CAACC;YACR9C,MAAM8C,KAAK,CAAC,CAAC,oBAAoB,EAAEA,MAAMC,OAAO,CAAC,CAAC;YAClDC,QAAQF,KAAK,CAAC,4BAA4BA;QAC5C;QACAG,UAAU,CAACC;YACT,IAAIA,OAAOV,MAAM,IAAInB,OAAO;gBAC1B,IAAIA,MAAM8B,IAAI,KAAK,YAAY;oBAC7BlB,WAAWiB,OAAOV,MAAM;oBACxB5B,oBAAoBsC,OAAOV,MAAM,EAAEY;gBACrC,OAAO,IAAI,UAAU/B,SAAS6B,OAAOV,MAAM,CAACnB,MAAMgC,IAAI,CAAC,KAAKC,WAAW;oBACrE,MAAMC,SAAS1C,oBAAoB;wBACjCY,iBAAiBK,mBAAmBV,OAAO;wBAC3CoC,cAAczB,qBAAqBX,OAAO;wBAC1CqC,gBAAgBP,OAAOV,MAAM,CAACnB,MAAMgC,IAAI,CAAC;wBACzCK,SAAS,AAACrC,MAAcqC,OAAO,KAAK;wBACpCC,KAAK,OAAO,AAACtC,MAAcsC,GAAG,KAAK,WAAW,AAACtC,MAAcsC,GAAG,GAAGL;wBACnEM,SAAS,OAAO,AAACvC,MAAcuC,OAAO,KAAK,WAAW,AAACvC,MAAcuC,OAAO,GAAGN;oBACjF;oBAEA,IAAIC,OAAOM,SAAS,EAAE;wBACpB7D,MAAM8D,IAAI,CAAC;oBACb;oBAEA7B,WAAWsB,OAAO3B,KAAK;oBACvBD,SAAS4B,OAAO3B,KAAK;gBACvB;YACF;QACF;QACAmC,QAAQ1D,WAAW;YACjB8C,MAAM;YACNa,sBAAsB;YACtBC,YAAY,CAAC;QACf;IACF;IAEA,MAAM,EAAEb,MAAM,EAAE,GAAG1B;IAEnB,gDAAgD;IAChDV,mBAAmB;QACjBoC;QACAd,WAAWC;QACXC;IACF;IAEA,+CAA+C;IAC/C,MAAM,EAAE0B,cAAc,EAAEC,WAAW,EAAEC,WAAW,EAAEC,SAAS,EAAE,GAAGvD,kBAAkB;QAChFK;IACF;IAEA,MAAMmD,eAAehE,YACnB,CAAC,EAAEiE,SAAS,SAAS,EAAEC,MAAM,EAAwB;QACnD,MAAMC,MAAMvC;QAEZ,MAAMwC,uBAAuBvD,iBAAiBC,OAAO;QAErD,MAAMuD,UAAU;YACdJ;YACAK,cAAcJ;YACdtD,eAAewD;QACjB;QAEA/B,OAAO;YACLkC,oBAAoBC,MAAMC,IAAI,CAAC3B,QAAQ4B,QAAQC,UAAU,EAAE;YAC3DR,KAAK;gBACH,GAAGA,GAAG;gBACNtC,IAAIC;YACN;YACAC,QAAQA,QAAQ6C;YAChBP;QACF;IACF,GACA;QAACtC,QAAQ6C;QAAM/D;QAAkBiB;QAAYF;QAASS;QAAQS;KAAO;IAGvE,MAAM+B,WAAW7E,YACf,OAAOqE;QACL,IAAI,AAACtD,OAAe8B,SAAS,UAAU;YACrC,OAAOe;QACT;QACA,2FAA2F;QAC3F,OAAOI,aAAaK,WAAW;YAAEJ,QAAQ;QAAU;IACrD,GACA;QAACL;QAAgBI;QAAcjD;KAAM;IAGvC,MAAMoB,OAAOnC,YAAY;QACvBoC;IACF,GAAG;QAACA;KAAW;IAEf,OAAO;QACLyC;QACAhB;QACA7B,WAAWC;QACX6B;QACAC;QACA5B;IACF;AACF,EAAC"}
@@ -1,23 +1,47 @@
1
1
  import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui';
2
- import { useCallback, useState } from 'react';
2
+ import { useCallback, useEffect, useRef, useState } from 'react';
3
3
  import { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD } from '../../../defaults.js';
4
4
  import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
5
+ import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
6
+ import { mergeGeneratedValue } from './mergeGeneratedValue.js';
5
7
  import { useHistory } from './useHistory.js';
6
8
  export const useGenerateUpload = ({ instructionIdRef })=>{
7
9
  const { config } = useConfig();
8
10
  const { routes: { api }, serverURL } = config;
9
11
  const { id: documentId, collectionSlug } = useDocumentInfo();
10
- const localFromContext = useLocale();
12
+ const locale = useLocale();
11
13
  const { getData } = useForm();
12
14
  const { set: setHistory } = useHistory();
13
- const { field, path: pathFromContext } = useFieldProps();
14
- const { setValue } = useField({
15
- path: pathFromContext ?? ''
15
+ const { field, path: fieldPath, schemaPath } = useFieldProps();
16
+ const { appendGenerated } = useInstructions({
17
+ schemaPath
16
18
  });
19
+ const { setValue, value: currentFieldValue } = useField({
20
+ path: fieldPath ?? ''
21
+ });
22
+ const appendGeneratedRef = useRef(!!appendGenerated);
23
+ const currentFieldValueRef = useRef(currentFieldValue);
17
24
  // Async job UI state
18
25
  const [jobStatus, setJobStatus] = useState(undefined);
19
26
  const [jobProgress, setJobProgress] = useState(0);
20
27
  const [isJobActive, setIsJobActive] = useState(false);
28
+ // Track whether the component is still mounted to prevent orphaned polling
29
+ const cancelledRef = useRef(false);
30
+ useEffect(()=>{
31
+ return ()=>{
32
+ cancelledRef.current = true;
33
+ };
34
+ }, []);
35
+ useEffect(()=>{
36
+ appendGeneratedRef.current = !!appendGenerated;
37
+ }, [
38
+ appendGenerated
39
+ ]);
40
+ useEffect(()=>{
41
+ currentFieldValueRef.current = currentFieldValue;
42
+ }, [
43
+ currentFieldValue
44
+ ]);
21
45
  const generateUpload = useCallback(async ()=>{
22
46
  const doc = getData();
23
47
  const currentInstructionId = instructionIdRef.current;
@@ -26,7 +50,7 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
26
50
  collectionSlug: collectionSlug ?? '',
27
51
  doc,
28
52
  documentId,
29
- locale: localFromContext?.code,
53
+ locale: locale?.code,
30
54
  options: {
31
55
  instructionId: currentInstructionId
32
56
  }
@@ -41,8 +65,21 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
41
65
  const json = await uploadResponse.json();
42
66
  const { job, result } = json || {};
43
67
  if (result) {
44
- setValue(result?.id);
45
- setHistory(result?.id);
68
+ const hasMany = field?.hasMany === true;
69
+ const generatedValue = Array.isArray(result) ? result.map((r)=>r.id) : result?.id;
70
+ const merged = mergeGeneratedValue({
71
+ appendGenerated: appendGeneratedRef.current,
72
+ currentValue: currentFieldValueRef.current,
73
+ generatedValue,
74
+ hasMany,
75
+ max: typeof field?.max === 'number' ? field.max : undefined,
76
+ maxRows: typeof field?.maxRows === 'number' ? field.maxRows : undefined
77
+ });
78
+ if (merged.truncated) {
79
+ toast.info('Appended values were truncated to this field maximum.');
80
+ }
81
+ setValue(merged.value);
82
+ setHistory(merged.value);
46
83
  // Show toast to prompt user to save
47
84
  toast.success('Image generated successfully! Click Save to see the preview.');
48
85
  return uploadResponse;
@@ -50,15 +87,10 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
50
87
  // Async job: poll AI Jobs collection for status/progress/result_id
51
88
  if (job && job.id) {
52
89
  setIsJobActive(true);
53
- const cancelled = false;
54
90
  let attempts = 0;
55
91
  const maxAttempts = 600 // up to ~10 minutes @ 1s
56
92
  ;
57
- // Basic in-hook state via closure variables; UI will re-render off fetches below
58
93
  const poll = async ()=>{
59
- if (cancelled) {
60
- return;
61
- }
62
94
  try {
63
95
  const res = await fetch(`${serverURL}${api}/${PLUGIN_AI_JOBS_TABLE}/${job.id}`, {
64
96
  credentials: 'include'
@@ -70,9 +102,10 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
70
102
  setJobProgress(progress ?? 0);
71
103
  // When result present, set field and finish
72
104
  if (status === 'completed' && result_id) {
105
+ const hasMany = field?.hasMany === true;
73
106
  let valueToSet = result_id;
74
107
  // Attempt to fetch full document for immediate preview
75
- if (field && 'relationTo' in field && typeof field.relationTo === 'string') {
108
+ if (!hasMany && field && 'relationTo' in field && typeof field.relationTo === 'string') {
76
109
  let attempts = 0;
77
110
  const maxAttempts = 3;
78
111
  while(attempts < maxAttempts){
@@ -97,8 +130,22 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
97
130
  }
98
131
  }
99
132
  }
100
- setValue(valueToSet);
101
- setHistory(result_id);
133
+ const generatedValue = hasMany ? [
134
+ result_id
135
+ ] : valueToSet;
136
+ const merged = mergeGeneratedValue({
137
+ appendGenerated: appendGeneratedRef.current,
138
+ currentValue: currentFieldValueRef.current,
139
+ generatedValue,
140
+ hasMany,
141
+ max: typeof field?.max === 'number' ? field.max : undefined,
142
+ maxRows: typeof field?.maxRows === 'number' ? field.maxRows : undefined
143
+ });
144
+ if (merged.truncated) {
145
+ toast.info('Appended values were truncated to this field maximum.');
146
+ }
147
+ setValue(merged.value);
148
+ setHistory(merged.value);
102
149
  setIsJobActive(false);
103
150
  return;
104
151
  }
@@ -111,7 +158,7 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
111
158
  // silent retry
112
159
  }
113
160
  attempts += 1;
114
- if (!cancelled && attempts < maxAttempts) {
161
+ if (attempts < maxAttempts && !cancelledRef.current) {
115
162
  setTimeout(poll, 1000);
116
163
  }
117
164
  };
@@ -130,9 +177,10 @@ export const useGenerateUpload = ({ instructionIdRef })=>{
130
177
  });
131
178
  }, [
132
179
  getData,
133
- localFromContext?.code,
180
+ locale?.code,
134
181
  instructionIdRef,
135
- // setValue,
182
+ setValue,
183
+ field,
136
184
  documentId,
137
185
  collectionSlug,
138
186
  serverURL,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerateUpload.ts"],"sourcesContent":["import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { type RefObject, useCallback, useState } from 'react'\n\nimport type { GenerateTextarea } from '../../../types.js'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useHistory } from './useHistory.js'\n\ntype UseGenerateUploadParams = {\n instructionIdRef: RefObject<string>\n}\n\nexport const useGenerateUpload = ({ instructionIdRef }: UseGenerateUploadParams) => {\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n const { id: documentId, collectionSlug } = useDocumentInfo()\n const localFromContext = useLocale()\n const { getData } = useForm()\n const { set: setHistory } = useHistory()\n\n const { field, path: pathFromContext } = useFieldProps()\n const { setValue } = useField<any>({\n path: pathFromContext ?? '',\n })\n\n // Async job UI state\n const [jobStatus, setJobStatus] = useState<string | undefined>(undefined)\n const [jobProgress, setJobProgress] = useState<number>(0)\n const [isJobActive, setIsJobActive] = useState<boolean>(false)\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n collectionSlug: collectionSlug ?? '',\n doc,\n documentId,\n locale: localFromContext?.code,\n options: {\n instructionId: currentInstructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const json = await uploadResponse.json()\n const { job, result } = json || {}\n if (result) {\n setValue(result?.id)\n setHistory(result?.id)\n\n // Show toast to prompt user to save\n toast.success('Image generated successfully! Click Save to see the preview.')\n\n return uploadResponse\n }\n\n // Async job: poll AI Jobs collection for status/progress/result_id\n if (job && job.id) {\n setIsJobActive(true)\n const cancelled = false\n let attempts = 0\n const maxAttempts = 600 // up to ~10 minutes @ 1s\n\n // Basic in-hook state via closure variables; UI will re-render off fetches below\n const poll = async (): Promise<void> => {\n if (cancelled) {\n return\n }\n try {\n const res = await fetch(`${serverURL}${api}/${PLUGIN_AI_JOBS_TABLE}/${job.id}`, {\n credentials: 'include',\n })\n if (res.ok) {\n const jobDoc = await res.json()\n const { progress, result_id, status } = jobDoc || {}\n setJobStatus(status)\n setJobProgress(progress ?? 0)\n // When result present, set field and finish\n if (status === 'completed' && result_id) {\n let valueToSet = result_id\n\n // Attempt to fetch full document for immediate preview\n if (field && 'relationTo' in field && typeof field.relationTo === 'string') {\n let attempts = 0\n const maxAttempts = 3\n while (attempts < maxAttempts) {\n try {\n const docRes = await fetch(\n `${serverURL}${api}/${field.relationTo}/${result_id}`,\n {\n credentials: 'include',\n },\n )\n if (docRes.ok) {\n const doc = await docRes.json()\n // Verify we have a URL for preview\n if (doc && doc.url) {\n valueToSet = doc\n break\n }\n }\n } catch (e) {\n console.error('Failed to fetch generated document for preview:', e)\n }\n attempts++\n if (attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n }\n }\n }\n\n setValue(valueToSet)\n setHistory(result_id)\n setIsJobActive(false)\n return\n }\n if (status === 'failed') {\n setIsJobActive(false)\n throw new Error('Video generation failed')\n }\n }\n } catch (_) {\n // silent retry\n }\n\n attempts += 1\n if (!cancelled && attempts < maxAttempts) {\n setTimeout(poll, 1000)\n }\n }\n setTimeout(poll, 1000)\n return uploadResponse\n }\n\n throw new Error('generateUpload: Unexpected response')\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error: any) => error.message).join(', ')\n throw new Error(errStr)\n }\n })\n .catch((error) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error(\n 'Error generating or setting your upload, please set it manually if its saved in your media files.',\n error,\n )\n })\n }, [\n getData,\n localFromContext?.code,\n instructionIdRef,\n // setValue,\n documentId,\n collectionSlug,\n serverURL,\n api,\n setHistory,\n ])\n\n return {\n generateUpload,\n isJobActive,\n jobProgress,\n jobStatus,\n }\n}\n"],"names":["toast","useConfig","useDocumentInfo","useField","useForm","useLocale","useCallback","useState","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","useFieldProps","useHistory","useGenerateUpload","instructionIdRef","config","routes","api","serverURL","id","documentId","collectionSlug","localFromContext","getData","set","setHistory","field","path","pathFromContext","setValue","jobStatus","setJobStatus","undefined","jobProgress","setJobProgress","isJobActive","setIsJobActive","generateUpload","doc","currentInstructionId","current","fetch","body","JSON","stringify","locale","code","options","instructionId","credentials","headers","method","then","uploadResponse","ok","json","job","result","success","cancelled","attempts","maxAttempts","poll","res","jobDoc","progress","result_id","status","valueToSet","relationTo","docRes","url","e","console","error","Promise","resolve","setTimeout","Error","_","errors","errStr","map","message","join","catch"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerateUpload.ts"],"sourcesContent":["import { toast, useConfig, useDocumentInfo, useField, useForm, useLocale } from '@payloadcms/ui'\nimport { type RefObject, useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { GenerateTextarea } from '../../../types.js'\n\nimport { PLUGIN_AI_JOBS_TABLE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD } from '../../../defaults.js'\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js'\nimport { mergeGeneratedValue } from './mergeGeneratedValue.js'\nimport { useHistory } from './useHistory.js'\n\ntype UseGenerateUploadParams = {\n instructionIdRef: RefObject<string>\n}\n\nexport const useGenerateUpload = ({ instructionIdRef }: UseGenerateUploadParams) => {\n const { config } = useConfig()\n const {\n routes: { api },\n serverURL,\n } = config\n const { id: documentId, collectionSlug } = useDocumentInfo()\n const locale = useLocale()\n const { getData } = useForm()\n const { set: setHistory } = useHistory()\n\n const { field, path: fieldPath, schemaPath } = useFieldProps()\n const { appendGenerated } = useInstructions({ schemaPath })\n const { setValue, value: currentFieldValue } = useField<any>({\n path: fieldPath ?? '',\n })\n const appendGeneratedRef = useRef(!!appendGenerated)\n const currentFieldValueRef = useRef(currentFieldValue)\n\n // Async job UI state\n const [jobStatus, setJobStatus] = useState<string | undefined>(undefined)\n const [jobProgress, setJobProgress] = useState<number>(0)\n const [isJobActive, setIsJobActive] = useState<boolean>(false)\n\n // Track whether the component is still mounted to prevent orphaned polling\n const cancelledRef = useRef(false)\n useEffect(() => {\n return () => {\n cancelledRef.current = true\n }\n }, [])\n\n useEffect(() => {\n appendGeneratedRef.current = !!appendGenerated\n }, [appendGenerated])\n\n useEffect(() => {\n currentFieldValueRef.current = currentFieldValue\n }, [currentFieldValue])\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n const currentInstructionId = instructionIdRef.current\n\n return fetch(`${serverURL}${api}${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n collectionSlug: collectionSlug ?? '',\n doc,\n documentId,\n locale: locale?.code,\n options: {\n instructionId: currentInstructionId,\n },\n } satisfies Parameters<GenerateTextarea>[0]),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n .then(async (uploadResponse) => {\n if (uploadResponse.ok) {\n const json = await uploadResponse.json()\n const { job, result } = json || {}\n if (result) {\n const hasMany = (field as any)?.hasMany === true\n const generatedValue = Array.isArray(result) ? result.map((r: any) => r.id) : result?.id\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue,\n hasMany,\n max: typeof (field as any)?.max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any)?.maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setValue(merged.value)\n setHistory(merged.value)\n\n // Show toast to prompt user to save\n toast.success('Image generated successfully! Click Save to see the preview.')\n\n return uploadResponse\n }\n\n // Async job: poll AI Jobs collection for status/progress/result_id\n if (job && job.id) {\n setIsJobActive(true)\n let attempts = 0\n const maxAttempts = 600 // up to ~10 minutes @ 1s\n\n const poll = async (): Promise<void> => {\n try {\n const res = await fetch(`${serverURL}${api}/${PLUGIN_AI_JOBS_TABLE}/${job.id}`, {\n credentials: 'include',\n })\n if (res.ok) {\n const jobDoc = await res.json()\n const { progress, result_id, status } = jobDoc || {}\n setJobStatus(status)\n setJobProgress(progress ?? 0)\n // When result present, set field and finish\n if (status === 'completed' && result_id) {\n const hasMany = (field as any)?.hasMany === true\n let valueToSet = result_id\n\n // Attempt to fetch full document for immediate preview\n if (\n !hasMany &&\n field &&\n 'relationTo' in field &&\n typeof field.relationTo === 'string'\n ) {\n let attempts = 0\n const maxAttempts = 3\n while (attempts < maxAttempts) {\n try {\n const docRes = await fetch(\n `${serverURL}${api}/${field.relationTo}/${result_id}`,\n {\n credentials: 'include',\n },\n )\n if (docRes.ok) {\n const doc = await docRes.json()\n // Verify we have a URL for preview\n if (doc && doc.url) {\n valueToSet = doc\n break\n }\n }\n } catch (e) {\n console.error('Failed to fetch generated document for preview:', e)\n }\n attempts++\n if (attempts < maxAttempts) {\n await new Promise((resolve) => setTimeout(resolve, 500))\n }\n }\n }\n\n const generatedValue = hasMany ? [result_id] : valueToSet\n const merged = mergeGeneratedValue({\n appendGenerated: appendGeneratedRef.current,\n currentValue: currentFieldValueRef.current,\n generatedValue,\n hasMany,\n max: typeof (field as any)?.max === 'number' ? (field as any).max : undefined,\n maxRows: typeof (field as any)?.maxRows === 'number' ? (field as any).maxRows : undefined,\n })\n\n if (merged.truncated) {\n toast.info('Appended values were truncated to this field maximum.')\n }\n\n setValue(merged.value)\n setHistory(merged.value)\n setIsJobActive(false)\n return\n }\n if (status === 'failed') {\n setIsJobActive(false)\n throw new Error('Video generation failed')\n }\n }\n } catch (_) {\n // silent retry\n }\n\n attempts += 1\n if (attempts < maxAttempts && !cancelledRef.current) {\n setTimeout(poll, 1000)\n }\n }\n setTimeout(poll, 1000)\n return uploadResponse\n }\n\n throw new Error('generateUpload: Unexpected response')\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error: any) => error.message).join(', ')\n throw new Error(errStr)\n }\n })\n .catch((error) => {\n toast.error(`Failed to generate: ${error.message}`)\n console.error(\n 'Error generating or setting your upload, please set it manually if its saved in your media files.',\n error,\n )\n })\n }, [\n getData,\n locale?.code,\n instructionIdRef,\n setValue,\n field,\n documentId,\n collectionSlug,\n serverURL,\n api,\n setHistory,\n ])\n\n return {\n generateUpload,\n isJobActive,\n jobProgress,\n jobStatus,\n }\n}\n"],"names":["toast","useConfig","useDocumentInfo","useField","useForm","useLocale","useCallback","useEffect","useRef","useState","PLUGIN_AI_JOBS_TABLE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","useFieldProps","useInstructions","mergeGeneratedValue","useHistory","useGenerateUpload","instructionIdRef","config","routes","api","serverURL","id","documentId","collectionSlug","locale","getData","set","setHistory","field","path","fieldPath","schemaPath","appendGenerated","setValue","value","currentFieldValue","appendGeneratedRef","currentFieldValueRef","jobStatus","setJobStatus","undefined","jobProgress","setJobProgress","isJobActive","setIsJobActive","cancelledRef","current","generateUpload","doc","currentInstructionId","fetch","body","JSON","stringify","code","options","instructionId","credentials","headers","method","then","uploadResponse","ok","json","job","result","hasMany","generatedValue","Array","isArray","map","r","merged","currentValue","max","maxRows","truncated","info","success","attempts","maxAttempts","poll","res","jobDoc","progress","result_id","status","valueToSet","relationTo","docRes","url","e","console","error","Promise","resolve","setTimeout","Error","_","errors","errStr","message","join","catch"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { useForm } from '@payloadcms/ui';
2
2
  import { useEffect, useRef } from 'react';
3
3
  import { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js';
4
- import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
4
+ import { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js';
5
5
  export const useStreamingUpdate = ({ editor, isLoading, object })=>{
6
- const { field, path: pathFromContext } = useFieldProps();
6
+ const { field, path: fieldPath } = useFieldProps();
7
7
  const { dispatchFields } = useForm();
8
8
  // Ref for latest object to avoid effect re-runs during high-frequency streaming
9
9
  const objectRef = useRef(object);
@@ -23,7 +23,7 @@ export const useStreamingUpdate = ({ editor, isLoading, object })=>{
23
23
  // Use dispatchFields for high-frequency streaming updates to avoid re-renders
24
24
  dispatchFields({
25
25
  type: 'UPDATE',
26
- path: pathFromContext ?? '',
26
+ path: fieldPath ?? '',
27
27
  value: currentObject[field.name]
28
28
  });
29
29
  }
@@ -41,7 +41,7 @@ export const useStreamingUpdate = ({ editor, isLoading, object })=>{
41
41
  editor,
42
42
  field,
43
43
  dispatchFields,
44
- pathFromContext
44
+ fieldPath
45
45
  ]);
46
46
  };
47
47
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ui/Compose/hooks/useStreamingUpdate.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\nimport { useForm } from '@payloadcms/ui'\nimport { useEffect, useRef } from 'react'\n\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\n\ntype UseStreamingUpdateParams = {\n editor: LexicalEditor\n isLoading: boolean\n object: any\n}\n\nexport const useStreamingUpdate = ({ editor, isLoading, object }: UseStreamingUpdateParams) => {\n const { field, path: pathFromContext } = useFieldProps()\n const { dispatchFields } = useForm()\n\n // Ref for latest object to avoid effect re-runs during high-frequency streaming\n const objectRef = useRef(object)\n objectRef.current = object\n\n useEffect(() => {\n // Only run the animation loop while loading (streaming)\n if (!isLoading) {\n return\n }\n\n let reqId: number\n\n const loop = () => {\n const currentObject = objectRef.current\n\n if (currentObject) {\n if (field?.type === 'richText') {\n setSafeLexicalState(currentObject, editor)\n } else if (field && 'name' in field && currentObject[field.name]) {\n // Use dispatchFields for high-frequency streaming updates to avoid re-renders\n dispatchFields({\n type: 'UPDATE',\n path: pathFromContext ?? '',\n value: currentObject[field.name],\n } as any)\n }\n }\n\n // Continue loop\n reqId = requestAnimationFrame(loop)\n }\n\n // Start loop\n loop()\n\n return () => {\n cancelAnimationFrame(reqId)\n }\n }, [isLoading, editor, field, dispatchFields, pathFromContext])\n}\n"],"names":["useForm","useEffect","useRef","useFieldProps","setSafeLexicalState","useStreamingUpdate","editor","isLoading","object","field","path","pathFromContext","dispatchFields","objectRef","current","reqId","loop","currentObject","type","name","value","requestAnimationFrame","cancelAnimationFrame"],"mappings":"AAEA,SAASA,OAAO,QAAQ,iBAAgB;AACxC,SAASC,SAAS,EAAEC,MAAM,QAAQ,QAAO;AAEzC,SAASC,aAAa,QAAQ,oDAAmD;AACjF,SAASC,mBAAmB,QAAQ,4CAA2C;AAQ/E,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,MAAM,EAAEC,SAAS,EAAEC,MAAM,EAA4B;IACxF,MAAM,EAAEC,KAAK,EAAEC,MAAMC,eAAe,EAAE,GAAGR;IACzC,MAAM,EAAES,cAAc,EAAE,GAAGZ;IAE3B,gFAAgF;IAChF,MAAMa,YAAYX,OAAOM;IACzBK,UAAUC,OAAO,GAAGN;IAEpBP,UAAU;QACR,wDAAwD;QACxD,IAAI,CAACM,WAAW;YACd;QACF;QAEA,IAAIQ;QAEJ,MAAMC,OAAO;YACX,MAAMC,gBAAgBJ,UAAUC,OAAO;YAEvC,IAAIG,eAAe;gBACjB,IAAIR,OAAOS,SAAS,YAAY;oBAC9Bd,oBAAoBa,eAAeX;gBACrC,OAAO,IAAIG,SAAS,UAAUA,SAASQ,aAAa,CAACR,MAAMU,IAAI,CAAC,EAAE;oBAChE,8EAA8E;oBAC9EP,eAAe;wBACbM,MAAM;wBACNR,MAAMC,mBAAmB;wBACzBS,OAAOH,aAAa,CAACR,MAAMU,IAAI,CAAC;oBAClC;gBACF;YACF;YAEA,gBAAgB;YAChBJ,QAAQM,sBAAsBL;QAChC;QAEA,aAAa;QACbA;QAEA,OAAO;YACLM,qBAAqBP;QACvB;IACF,GAAG;QAACR;QAAWD;QAAQG;QAAOG;QAAgBD;KAAgB;AAChE,EAAC"}
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useStreamingUpdate.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\nimport { useForm } from '@payloadcms/ui'\nimport { useEffect, useRef } from 'react'\n\nimport { useFieldProps } from '../../../providers/FieldProvider/useFieldProps.js'\nimport { setSafeLexicalState } from '../../../utilities/lexical/setSafeLexicalState.js'\n\ntype UseStreamingUpdateParams = {\n editor: LexicalEditor\n isLoading: boolean\n object: any\n}\n\nexport const useStreamingUpdate = ({ editor, isLoading, object }: UseStreamingUpdateParams) => {\n const { field, path: fieldPath } = useFieldProps()\n const { dispatchFields } = useForm()\n\n // Ref for latest object to avoid effect re-runs during high-frequency streaming\n const objectRef = useRef(object)\n objectRef.current = object\n\n useEffect(() => {\n // Only run the animation loop while loading (streaming)\n if (!isLoading) {\n return\n }\n\n let reqId: number\n\n const loop = () => {\n const currentObject = objectRef.current\n\n if (currentObject) {\n if (field?.type === 'richText') {\n setSafeLexicalState(currentObject, editor)\n } else if (field && 'name' in field && currentObject[field.name]) {\n // Use dispatchFields for high-frequency streaming updates to avoid re-renders\n dispatchFields({\n type: 'UPDATE',\n path: fieldPath ?? '',\n value: currentObject[field.name],\n } as any)\n }\n }\n\n // Continue loop\n reqId = requestAnimationFrame(loop)\n }\n\n // Start loop\n loop()\n\n return () => {\n cancelAnimationFrame(reqId)\n }\n }, [isLoading, editor, field, dispatchFields, fieldPath])\n}\n"],"names":["useForm","useEffect","useRef","useFieldProps","setSafeLexicalState","useStreamingUpdate","editor","isLoading","object","field","path","fieldPath","dispatchFields","objectRef","current","reqId","loop","currentObject","type","name","value","requestAnimationFrame","cancelAnimationFrame"],"mappings":"AAEA,SAASA,OAAO,QAAQ,iBAAgB;AACxC,SAASC,SAAS,EAAEC,MAAM,QAAQ,QAAO;AAEzC,SAASC,aAAa,QAAQ,oDAAmD;AACjF,SAASC,mBAAmB,QAAQ,oDAAmD;AAQvF,OAAO,MAAMC,qBAAqB,CAAC,EAAEC,MAAM,EAAEC,SAAS,EAAEC,MAAM,EAA4B;IACxF,MAAM,EAAEC,KAAK,EAAEC,MAAMC,SAAS,EAAE,GAAGR;IACnC,MAAM,EAAES,cAAc,EAAE,GAAGZ;IAE3B,gFAAgF;IAChF,MAAMa,YAAYX,OAAOM;IACzBK,UAAUC,OAAO,GAAGN;IAEpBP,UAAU;QACR,wDAAwD;QACxD,IAAI,CAACM,WAAW;YACd;QACF;QAEA,IAAIQ;QAEJ,MAAMC,OAAO;YACX,MAAMC,gBAAgBJ,UAAUC,OAAO;YAEvC,IAAIG,eAAe;gBACjB,IAAIR,OAAOS,SAAS,YAAY;oBAC9Bd,oBAAoBa,eAAeX;gBACrC,OAAO,IAAIG,SAAS,UAAUA,SAASQ,aAAa,CAACR,MAAMU,IAAI,CAAC,EAAE;oBAChE,8EAA8E;oBAC9EP,eAAe;wBACbM,MAAM;wBACNR,MAAMC,aAAa;wBACnBS,OAAOH,aAAa,CAACR,MAAMU,IAAI,CAAC;oBAClC;gBACF;YACF;YAEA,gBAAgB;YAChBJ,QAAQM,sBAAsBL;QAChC;QAEA,aAAa;QACbA;QAEA,OAAO;YACLM,qBAAqBP;QACvB;IACF,GAAG;QAACR;QAAWD;QAAQG;QAAOG;QAAgBD;KAAU;AAC1D,EAAC"}
@@ -0,0 +1,94 @@
1
+ .wrapper {
2
+ background: var(--theme-elevation-50);
3
+ margin-bottom: 20px;
4
+ overflow: hidden;
5
+ }
6
+
7
+ .header {
8
+ align-items: center;
9
+ border-bottom: 1px solid var(--theme-elevation-150);
10
+ display: flex;
11
+ justify-content: space-between;
12
+ padding: 8px var(--gutter-h);
13
+ }
14
+
15
+ .title {
16
+ margin: 0 0 5px 0;
17
+ }
18
+
19
+ .subtitle {
20
+ color: var(--theme-elevation-500);
21
+ font-size: 14px;
22
+ margin: 0;
23
+ }
24
+
25
+ .headerActions {
26
+ display: flex;
27
+ gap: 10px;
28
+ }
29
+
30
+ .body {
31
+ padding: 24px var(--gutter-h);
32
+ }
33
+
34
+ .bodyTitle {
35
+ margin-bottom: 15px;
36
+ }
37
+
38
+ .grid {
39
+ display: grid;
40
+ gap: 15px;
41
+ grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
42
+ }
43
+
44
+ .toggleButton {
45
+ align-items: center;
46
+ border: 1px solid var(--theme-elevation-200);
47
+ border-radius: 6px;
48
+ background: var(--theme-elevation-50);
49
+ cursor: pointer;
50
+ display: flex;
51
+ gap: 10px;
52
+ padding: 10px 15px;
53
+ text-align: left;
54
+ transition: all 0.2s ease;
55
+ width: 100%;
56
+ }
57
+
58
+ .toggleButton[data-enabled='true'] {
59
+ background: var(--theme-elevation-100);
60
+ border-color: var(--theme-text-success);
61
+ }
62
+
63
+ .toggleTrack {
64
+ align-items: center;
65
+ background: var(--theme-elevation-200);
66
+ border-radius: 12px;
67
+ display: flex;
68
+ height: 24px;
69
+ justify-content: flex-start;
70
+ padding: 2px;
71
+ transition: all 0.2s ease;
72
+ width: 44px;
73
+ }
74
+
75
+ .toggleButton[data-enabled='true'] .toggleTrack {
76
+ background: var(--theme-text-success);
77
+ justify-content: flex-end;
78
+ }
79
+
80
+ .toggleKnob {
81
+ background: white;
82
+ border-radius: 50%;
83
+ height: 20px;
84
+ width: 20px;
85
+ }
86
+
87
+ .toggleLabel {
88
+ font-weight: 500;
89
+ }
90
+
91
+ .loading {
92
+ padding: 20px;
93
+ text-align: center;
94
+ }
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export declare const ConfigDashboard: React.FC;