@ai-stack/payloadcms 3.0.0-beta.104

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 (250) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +137 -0
  3. package/dist/ai/analyse.d.ts +2 -0
  4. package/dist/ai/analyse.d.ts.map +1 -0
  5. package/dist/ai/analyse.js +3 -0
  6. package/dist/ai/analyse.js.map +1 -0
  7. package/dist/ai/models/anthropic/generateRichText.d.ts +2 -0
  8. package/dist/ai/models/anthropic/generateRichText.d.ts.map +1 -0
  9. package/dist/ai/models/anthropic/generateRichText.js +38 -0
  10. package/dist/ai/models/anthropic/generateRichText.js.map +1 -0
  11. package/dist/ai/models/anthropic/index.d.ts +3 -0
  12. package/dist/ai/models/anthropic/index.d.ts.map +1 -0
  13. package/dist/ai/models/anthropic/index.js +112 -0
  14. package/dist/ai/models/anthropic/index.js.map +1 -0
  15. package/dist/ai/models/elevenLabs/generateVoice.d.ts +10 -0
  16. package/dist/ai/models/elevenLabs/generateVoice.d.ts.map +1 -0
  17. package/dist/ai/models/elevenLabs/generateVoice.js +20 -0
  18. package/dist/ai/models/elevenLabs/generateVoice.js.map +1 -0
  19. package/dist/ai/models/elevenLabs/index.d.ts +3 -0
  20. package/dist/ai/models/elevenLabs/index.d.ts.map +1 -0
  21. package/dist/ai/models/elevenLabs/index.js +129 -0
  22. package/dist/ai/models/elevenLabs/index.js.map +1 -0
  23. package/dist/ai/models/elevenLabs/voices.d.ts +4 -0
  24. package/dist/ai/models/elevenLabs/voices.d.ts.map +1 -0
  25. package/dist/ai/models/elevenLabs/voices.js +24 -0
  26. package/dist/ai/models/elevenLabs/voices.js.map +1 -0
  27. package/dist/ai/models/example-prompt-rich-text.md +47 -0
  28. package/dist/ai/models/example.d.ts +73 -0
  29. package/dist/ai/models/example.d.ts.map +1 -0
  30. package/dist/ai/models/example.js +126 -0
  31. package/dist/ai/models/example.js.map +1 -0
  32. package/dist/ai/models/index.d.ts +3 -0
  33. package/dist/ai/models/index.d.ts.map +1 -0
  34. package/dist/ai/models/index.js +11 -0
  35. package/dist/ai/models/index.js.map +1 -0
  36. package/dist/ai/models/openai/generateImage.d.ts +10 -0
  37. package/dist/ai/models/openai/generateImage.d.ts.map +1 -0
  38. package/dist/ai/models/openai/generateImage.js +20 -0
  39. package/dist/ai/models/openai/generateImage.js.map +1 -0
  40. package/dist/ai/models/openai/generateRichText.d.ts +2 -0
  41. package/dist/ai/models/openai/generateRichText.d.ts.map +1 -0
  42. package/dist/ai/models/openai/generateRichText.js +38 -0
  43. package/dist/ai/models/openai/generateRichText.js.map +1 -0
  44. package/dist/ai/models/openai/generateVoice.d.ts +7 -0
  45. package/dist/ai/models/openai/generateVoice.d.ts.map +1 -0
  46. package/dist/ai/models/openai/generateVoice.js +19 -0
  47. package/dist/ai/models/openai/generateVoice.js.map +1 -0
  48. package/dist/ai/models/openai/index.d.ts +3 -0
  49. package/dist/ai/models/openai/index.d.ts.map +1 -0
  50. package/dist/ai/models/openai/index.js +276 -0
  51. package/dist/ai/models/openai/index.js.map +1 -0
  52. package/dist/ai/prompts.d.ts +25 -0
  53. package/dist/ai/prompts.d.ts.map +1 -0
  54. package/dist/ai/prompts.js +214 -0
  55. package/dist/ai/prompts.js.map +1 -0
  56. package/dist/ai/schemas/lexical.schema.d.ts +31 -0
  57. package/dist/ai/schemas/lexical.schema.d.ts.map +1 -0
  58. package/dist/ai/schemas/lexical.schema.js +102 -0
  59. package/dist/ai/schemas/lexical.schema.js.map +1 -0
  60. package/dist/ai/utils/generateFileNameByPrompt.d.ts +2 -0
  61. package/dist/ai/utils/generateFileNameByPrompt.d.ts.map +1 -0
  62. package/dist/ai/utils/generateFileNameByPrompt.js +21 -0
  63. package/dist/ai/utils/generateFileNameByPrompt.js.map +1 -0
  64. package/dist/ai/utils/generateSeedPrompt.d.ts +5 -0
  65. package/dist/ai/utils/generateSeedPrompt.d.ts.map +1 -0
  66. package/dist/ai/utils/generateSeedPrompt.js +23 -0
  67. package/dist/ai/utils/generateSeedPrompt.js.map +1 -0
  68. package/dist/collections/Instructions.d.ts +3 -0
  69. package/dist/collections/Instructions.d.ts.map +1 -0
  70. package/dist/collections/Instructions.js +109 -0
  71. package/dist/collections/Instructions.js.map +1 -0
  72. package/dist/defaults.d.ts +10 -0
  73. package/dist/defaults.d.ts.map +1 -0
  74. package/dist/defaults.js +13 -0
  75. package/dist/defaults.js.map +1 -0
  76. package/dist/endpoints/index.d.ts +3 -0
  77. package/dist/endpoints/index.d.ts.map +1 -0
  78. package/dist/endpoints/index.js +141 -0
  79. package/dist/endpoints/index.js.map +1 -0
  80. package/dist/exports/client.d.ts +3 -0
  81. package/dist/exports/client.d.ts.map +1 -0
  82. package/dist/exports/client.js +4 -0
  83. package/dist/exports/client.js.map +1 -0
  84. package/dist/exports/fields.d.ts +4 -0
  85. package/dist/exports/fields.d.ts.map +1 -0
  86. package/dist/exports/fields.js +5 -0
  87. package/dist/exports/fields.js.map +1 -0
  88. package/dist/exports/types.d.ts +3 -0
  89. package/dist/exports/types.d.ts.map +1 -0
  90. package/dist/exports/types.js +3 -0
  91. package/dist/exports/types.js.map +1 -0
  92. package/dist/fields/ComposeField/ComposeField.d.ts +4 -0
  93. package/dist/fields/ComposeField/ComposeField.d.ts.map +1 -0
  94. package/dist/fields/ComposeField/ComposeField.js +18 -0
  95. package/dist/fields/ComposeField/ComposeField.js.map +1 -0
  96. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts +2 -0
  97. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -0
  98. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js +15 -0
  99. package/dist/fields/LexicalEditor/ComposeFeatureComponent.js.map +1 -0
  100. package/dist/fields/LexicalEditor/feature.client.d.ts +2 -0
  101. package/dist/fields/LexicalEditor/feature.client.d.ts.map +1 -0
  102. package/dist/fields/LexicalEditor/feature.client.js +13 -0
  103. package/dist/fields/LexicalEditor/feature.client.js.map +1 -0
  104. package/dist/fields/LexicalEditor/feature.server.d.ts +2 -0
  105. package/dist/fields/LexicalEditor/feature.server.d.ts.map +1 -0
  106. package/dist/fields/LexicalEditor/feature.server.js +12 -0
  107. package/dist/fields/LexicalEditor/feature.server.js.map +1 -0
  108. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +4 -0
  109. package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -0
  110. package/dist/fields/PromptEditorField/PromptEditorField.js +41 -0
  111. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -0
  112. package/dist/fields/SelectField/SelectField.d.ts +10 -0
  113. package/dist/fields/SelectField/SelectField.d.ts.map +1 -0
  114. package/dist/fields/SelectField/SelectField.js +41 -0
  115. package/dist/fields/SelectField/SelectField.js.map +1 -0
  116. package/dist/index.d.ts +10 -0
  117. package/dist/index.d.ts.map +1 -0
  118. package/dist/index.js +10 -0
  119. package/dist/index.js.map +1 -0
  120. package/dist/init.d.ts +4 -0
  121. package/dist/init.d.ts.map +1 -0
  122. package/dist/init.js +81 -0
  123. package/dist/init.js.map +1 -0
  124. package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts +8 -0
  125. package/dist/libraries/autocomplete/AutocompleteTextArea.d.ts.map +1 -0
  126. package/dist/libraries/autocomplete/AutocompleteTextArea.js +437 -0
  127. package/dist/libraries/autocomplete/AutocompleteTextArea.js.map +1 -0
  128. package/dist/libraries/autocomplete/AutocompleteTextArea.module.scss +35 -0
  129. package/dist/libraries/handlebars/asyncHandlebars.d.ts +2 -0
  130. package/dist/libraries/handlebars/asyncHandlebars.d.ts.map +1 -0
  131. package/dist/libraries/handlebars/asyncHandlebars.js +5 -0
  132. package/dist/libraries/handlebars/asyncHandlebars.js.map +1 -0
  133. package/dist/libraries/handlebars/helpers.d.ts +2 -0
  134. package/dist/libraries/handlebars/helpers.d.ts.map +1 -0
  135. package/dist/libraries/handlebars/helpers.js +22 -0
  136. package/dist/libraries/handlebars/helpers.js.map +1 -0
  137. package/dist/libraries/handlebars/helpersMap.d.ts +12 -0
  138. package/dist/libraries/handlebars/helpersMap.d.ts.map +1 -0
  139. package/dist/libraries/handlebars/helpersMap.js +13 -0
  140. package/dist/libraries/handlebars/helpersMap.js.map +1 -0
  141. package/dist/libraries/handlebars/replacePlaceholders.d.ts +2 -0
  142. package/dist/libraries/handlebars/replacePlaceholders.d.ts.map +1 -0
  143. package/dist/libraries/handlebars/replacePlaceholders.js +8 -0
  144. package/dist/libraries/handlebars/replacePlaceholders.js.map +1 -0
  145. package/dist/plugin.d.ts +5 -0
  146. package/dist/plugin.d.ts.map +1 -0
  147. package/dist/plugin.js +121 -0
  148. package/dist/plugin.js.map +1 -0
  149. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts +6 -0
  150. package/dist/providers/InstructionsProvider/InstructionsProvider.d.ts.map +1 -0
  151. package/dist/providers/InstructionsProvider/InstructionsProvider.js +31 -0
  152. package/dist/providers/InstructionsProvider/InstructionsProvider.js.map +1 -0
  153. package/dist/providers/InstructionsProvider/useInstructions.d.ts +4 -0
  154. package/dist/providers/InstructionsProvider/useInstructions.d.ts.map +1 -0
  155. package/dist/providers/InstructionsProvider/useInstructions.js +38 -0
  156. package/dist/providers/InstructionsProvider/useInstructions.js.map +1 -0
  157. package/dist/styles.d.js +2 -0
  158. package/dist/styles.d.js.map +1 -0
  159. package/dist/translations/en.json +4 -0
  160. package/dist/translations/es.json +4 -0
  161. package/dist/translations/fa.json +4 -0
  162. package/dist/translations/fr.json +4 -0
  163. package/dist/translations/index.d.ts +38 -0
  164. package/dist/translations/index.d.ts.map +1 -0
  165. package/dist/translations/index.js +36 -0
  166. package/dist/translations/index.js.map +1 -0
  167. package/dist/translations/pl.json +4 -0
  168. package/dist/translations/ru.json +4 -0
  169. package/dist/translations/translation-schema.json +16 -0
  170. package/dist/translations/uk.json +4 -0
  171. package/dist/types.d.ts +94 -0
  172. package/dist/types.d.ts.map +1 -0
  173. package/dist/types.js +6 -0
  174. package/dist/types.js.map +1 -0
  175. package/dist/ui/Compose/Compose.d.ts +9 -0
  176. package/dist/ui/Compose/Compose.d.ts.map +1 -0
  177. package/dist/ui/Compose/Compose.js +176 -0
  178. package/dist/ui/Compose/Compose.js.map +1 -0
  179. package/dist/ui/Compose/UndoRedoActions.d.ts +4 -0
  180. package/dist/ui/Compose/UndoRedoActions.d.ts.map +1 -0
  181. package/dist/ui/Compose/UndoRedoActions.js +56 -0
  182. package/dist/ui/Compose/UndoRedoActions.js.map +1 -0
  183. package/dist/ui/Compose/compose.module.scss +19 -0
  184. package/dist/ui/Compose/hooks/menu/Item.d.ts +5 -0
  185. package/dist/ui/Compose/hooks/menu/Item.d.ts.map +1 -0
  186. package/dist/ui/Compose/hooks/menu/Item.js +32 -0
  187. package/dist/ui/Compose/hooks/menu/Item.js.map +1 -0
  188. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts +4 -0
  189. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -0
  190. package/dist/ui/Compose/hooks/menu/TranslateMenu.js +78 -0
  191. package/dist/ui/Compose/hooks/menu/TranslateMenu.js.map +1 -0
  192. package/dist/ui/Compose/hooks/menu/items.d.ts +9 -0
  193. package/dist/ui/Compose/hooks/menu/items.d.ts.map +1 -0
  194. package/dist/ui/Compose/hooks/menu/items.js +12 -0
  195. package/dist/ui/Compose/hooks/menu/items.js.map +1 -0
  196. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts +11 -0
  197. package/dist/ui/Compose/hooks/menu/itemsMap.d.ts.map +1 -0
  198. package/dist/ui/Compose/hooks/menu/itemsMap.js +68 -0
  199. package/dist/ui/Compose/hooks/menu/itemsMap.js.map +1 -0
  200. package/dist/ui/Compose/hooks/menu/menu.module.scss +109 -0
  201. package/dist/ui/Compose/hooks/menu/useMenu.d.ts +11 -0
  202. package/dist/ui/Compose/hooks/menu/useMenu.d.ts.map +1 -0
  203. package/dist/ui/Compose/hooks/menu/useMenu.js +93 -0
  204. package/dist/ui/Compose/hooks/menu/useMenu.js.map +1 -0
  205. package/dist/ui/Compose/hooks/useGenerate.d.ts +11 -0
  206. package/dist/ui/Compose/hooks/useGenerate.d.ts.map +1 -0
  207. package/dist/ui/Compose/hooks/useGenerate.js +175 -0
  208. package/dist/ui/Compose/hooks/useGenerate.js.map +1 -0
  209. package/dist/ui/Compose/hooks/useHistory.d.ts +9 -0
  210. package/dist/ui/Compose/hooks/useHistory.d.ts.map +1 -0
  211. package/dist/ui/Compose/hooks/useHistory.js +171 -0
  212. package/dist/ui/Compose/hooks/useHistory.js.map +1 -0
  213. package/dist/ui/Icons/Icons.d.ts +45 -0
  214. package/dist/ui/Icons/Icons.d.ts.map +1 -0
  215. package/dist/ui/Icons/Icons.js +154 -0
  216. package/dist/ui/Icons/Icons.js.map +1 -0
  217. package/dist/ui/Icons/LottieAnimation.d.ts +5 -0
  218. package/dist/ui/Icons/LottieAnimation.d.ts.map +1 -0
  219. package/dist/ui/Icons/LottieAnimation.js +100 -0
  220. package/dist/ui/Icons/LottieAnimation.js.map +1 -0
  221. package/dist/ui/Icons/icons.module.css +26 -0
  222. package/dist/utilities/getFieldBySchemaPath.d.ts +3 -0
  223. package/dist/utilities/getFieldBySchemaPath.d.ts.map +1 -0
  224. package/dist/utilities/getFieldBySchemaPath.js +37 -0
  225. package/dist/utilities/getFieldBySchemaPath.js.map +1 -0
  226. package/dist/utilities/getFieldInfo.d.ts +3 -0
  227. package/dist/utilities/getFieldInfo.d.ts.map +1 -0
  228. package/dist/utilities/getFieldInfo.js +14 -0
  229. package/dist/utilities/getFieldInfo.js.map +1 -0
  230. package/dist/utilities/isPluginActivated.d.ts +2 -0
  231. package/dist/utilities/isPluginActivated.d.ts.map +1 -0
  232. package/dist/utilities/isPluginActivated.js +5 -0
  233. package/dist/utilities/isPluginActivated.js.map +1 -0
  234. package/dist/utilities/jsonToZod.d.ts +3 -0
  235. package/dist/utilities/jsonToZod.d.ts.map +1 -0
  236. package/dist/utilities/jsonToZod.js +33 -0
  237. package/dist/utilities/jsonToZod.js.map +1 -0
  238. package/dist/utilities/lexicalToHTML.d.ts +4 -0
  239. package/dist/utilities/lexicalToHTML.d.ts.map +1 -0
  240. package/dist/utilities/lexicalToHTML.js +11 -0
  241. package/dist/utilities/lexicalToHTML.js.map +1 -0
  242. package/dist/utilities/setSafeLexicalState.d.ts +5 -0
  243. package/dist/utilities/setSafeLexicalState.d.ts.map +1 -0
  244. package/dist/utilities/setSafeLexicalState.js +20 -0
  245. package/dist/utilities/setSafeLexicalState.js.map +1 -0
  246. package/dist/utilities/updateFieldsConfig.d.ts +8 -0
  247. package/dist/utilities/updateFieldsConfig.d.ts.map +1 -0
  248. package/dist/utilities/updateFieldsConfig.js +89 -0
  249. package/dist/utilities/updateFieldsConfig.js.map +1 -0
  250. package/package.json +124 -0
@@ -0,0 +1,109 @@
1
+ .generate_button {
2
+ cursor: pointer;
3
+ border: none;
4
+ background: transparent none;
5
+ padding: 0;
6
+ color: var(--theme-elevation-800);
7
+ transition: opacity 0.3s ease;
8
+ opacity: 1;
9
+
10
+ > .icon {
11
+ width: 20px;
12
+ }
13
+
14
+ > .text {
15
+ flex-grow: 2;
16
+ }
17
+
18
+ &:active {
19
+ opacity: 0.5;
20
+ }
21
+
22
+ [data-disabled] {
23
+ opacity: 0.5;
24
+ cursor: not-allowed;
25
+ }
26
+ }
27
+
28
+ .menu {
29
+ display: flex;
30
+ gap: 1px;
31
+ flex-direction: column;
32
+
33
+ > span {
34
+ padding: 4px 8px;
35
+ border-radius: 4px;
36
+ display: flex;
37
+ gap: 8px;
38
+ width: var(--popup-width);
39
+
40
+ &.active {
41
+ background: var(--theme-elevation-100);
42
+ }
43
+
44
+ &:hover {
45
+ background: var(--theme-elevation-100);
46
+ }
47
+ }
48
+ }
49
+
50
+ .subMenu {
51
+ position: absolute;
52
+ left: calc(var(--popup-width) + 12px);
53
+ width: calc(var(--popup-width) + 12px);
54
+ top: 10px;
55
+ height: calc(100% - 16px);
56
+
57
+ overflow: auto;
58
+ }
59
+
60
+ .hoverMenu {
61
+ overflow: hidden;
62
+ min-width: 0;
63
+ opacity: 0;
64
+ transition: opacity 250ms ease-in;
65
+
66
+ .subMenu {
67
+ display: none;
68
+ }
69
+
70
+ &[data-show=true]{
71
+ min-width: calc(var(--popup-width) * 2 + 12px);
72
+ opacity: 1;
73
+
74
+ .subMenu {
75
+ display: block;
76
+ }
77
+ }
78
+ }
79
+
80
+ .menuInput {
81
+ box-shadow: 0 2px 3px #0002040d, 0 10px 4px -8px #00020405;
82
+ font-family: var(--font-body);
83
+ border: 1px solid var(--theme-elevation-150);
84
+ background: var(--theme-input-bg);
85
+ color: var(--theme-elevation-800);
86
+ border-radius: 0;
87
+ -webkit-appearance: none;
88
+
89
+ font-size: inherit !important;
90
+ height: auto !important;
91
+ line-height: 1.9rem;
92
+
93
+ width: 100%;
94
+ padding: 4px 8px !important;
95
+
96
+ outline: none;
97
+ &:focus-visible{
98
+ outline: none;
99
+ }
100
+ }
101
+
102
+ .ellipsis {
103
+ white-space: nowrap;
104
+ overflow: hidden;
105
+ text-overflow: ellipsis;
106
+
107
+ display: inline-block;
108
+ width: calc(var(--popup-width) + 12px);
109
+ }
@@ -0,0 +1,11 @@
1
+ import type { UseMenuEvents } from '../../../../types.js';
2
+ export declare const useMenu: (menuEvents: UseMenuEvents) => {
3
+ ActiveComponent: ({ isLoading }: {
4
+ isLoading: any;
5
+ }) => import("react/jsx-runtime").JSX.Element;
6
+ Menu: ({ isLoading, onClose }: {
7
+ isLoading: any;
8
+ onClose: any;
9
+ }) => import("react/jsx-runtime").JSX.Element;
10
+ };
11
+ //# sourceMappingURL=useMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAmB1E,eAAO,MAAM,OAAO,eAAgB,aAAa;;;;;;;;CAyEhD,CAAA"}
@@ -0,0 +1,93 @@
1
+ 'use client';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
+ import { useField, useFieldProps } from '@payloadcms/ui';
4
+ import React, { useEffect, useMemo, useState } from 'react';
5
+ import { Compose, Proofread, Rephrase } from './items.js';
6
+ import { menuItemsMap } from './itemsMap.js';
7
+ import styles from './menu.module.scss';
8
+ const getActiveComponent = (ac)=>{
9
+ switch(ac){
10
+ case 'Proofread':
11
+ return Proofread;
12
+ case 'Rephrase':
13
+ return Rephrase;
14
+ case 'Compose':
15
+ return Compose;
16
+ default:
17
+ return Rephrase;
18
+ }
19
+ };
20
+ export const useMenu = (menuEvents)=>{
21
+ const { type: fieldType, path: pathFromContext } = useFieldProps();
22
+ const field = useField({
23
+ path: pathFromContext
24
+ });
25
+ const [activeComponent, setActiveComponent] = useState('Rephrase');
26
+ const { initialValue, value } = field;
27
+ useEffect(()=>{
28
+ if (!value) {
29
+ setActiveComponent('Compose');
30
+ return;
31
+ }
32
+ if (menuItemsMap.some((i)=>i.excludedFor?.includes(fieldType))) {
33
+ setActiveComponent('Compose');
34
+ return;
35
+ }
36
+ if (typeof value === 'string' && value !== initialValue) {
37
+ setActiveComponent('Proofread');
38
+ } else {
39
+ setActiveComponent('Rephrase');
40
+ }
41
+ }, [
42
+ initialValue,
43
+ value,
44
+ fieldType
45
+ ]);
46
+ const MemoizedActiveComponent = useMemo(()=>{
47
+ return ({ isLoading })=>{
48
+ const ActiveComponent = getActiveComponent(activeComponent);
49
+ const activeItem = menuItemsMap.find((i)=>i.name === activeComponent);
50
+ return /*#__PURE__*/ _jsx(ActiveComponent, {
51
+ disabled: isLoading,
52
+ hideIcon: true,
53
+ onClick: menuEvents[`on${activeComponent}`],
54
+ children: isLoading && activeItem.loadingText
55
+ });
56
+ };
57
+ }, [
58
+ activeComponent,
59
+ menuEvents
60
+ ]);
61
+ const filteredMenuItems = useMemo(()=>menuItemsMap.filter((i)=>i.name !== activeComponent && !i.excludedFor?.includes(fieldType)), [
62
+ activeComponent,
63
+ fieldType
64
+ ]);
65
+ const MemoizedMenu = useMemo(()=>{
66
+ return ({ isLoading, onClose })=>/*#__PURE__*/ _jsx("div", {
67
+ className: styles.menu,
68
+ children: filteredMenuItems.map((i)=>{
69
+ const Action = i.component;
70
+ return /*#__PURE__*/ _jsx(Action, {
71
+ disabled: isLoading,
72
+ onClick: (data)=>{
73
+ if (i.name !== 'Settings') {
74
+ setActiveComponent(i.name);
75
+ }
76
+ menuEvents[`on${i.name}`](data);
77
+ onClose();
78
+ },
79
+ children: isLoading && i.loadingText
80
+ }, i.name);
81
+ })
82
+ });
83
+ }, [
84
+ filteredMenuItems,
85
+ menuEvents
86
+ ]);
87
+ return {
88
+ ActiveComponent: MemoizedActiveComponent,
89
+ Menu: MemoizedMenu
90
+ };
91
+ };
92
+
93
+ //# sourceMappingURL=useMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/useMenu.tsx"],"sourcesContent":["'use client'\n\nimport { useField, useFieldProps } from '@payloadcms/ui'\nimport React, { useEffect, useMemo, useState } from 'react'\n\nimport type { ActionMenuItems, UseMenuEvents } from '../../../../types.js'\n\nimport { Compose, Proofread, Rephrase } from './items.js'\nimport { menuItemsMap } from './itemsMap.js'\nimport styles from './menu.module.scss'\n\nconst getActiveComponent = (ac) => {\n switch (ac) {\n case 'Proofread':\n return Proofread\n case 'Rephrase':\n return Rephrase\n case 'Compose':\n return Compose\n default:\n return Rephrase\n }\n}\n\nexport const useMenu = (menuEvents: UseMenuEvents) => {\n const { type: fieldType, path: pathFromContext } = useFieldProps()\n const field = useField({ path: pathFromContext })\n const [activeComponent, setActiveComponent] = useState<ActionMenuItems>('Rephrase')\n\n const { initialValue, value } = field\n\n useEffect(() => {\n if (!value) {\n setActiveComponent('Compose')\n return\n }\n\n if (menuItemsMap.some((i) => i.excludedFor?.includes(fieldType))) {\n setActiveComponent('Compose')\n return\n }\n\n if (typeof value === 'string' && value !== initialValue) {\n setActiveComponent('Proofread')\n } else {\n setActiveComponent('Rephrase')\n }\n }, [initialValue, value, fieldType])\n\n const MemoizedActiveComponent = useMemo(() => {\n return ({ isLoading }) => {\n const ActiveComponent = getActiveComponent(activeComponent)\n const activeItem = menuItemsMap.find((i) => i.name === activeComponent)\n return (\n <ActiveComponent disabled={isLoading} hideIcon onClick={menuEvents[`on${activeComponent}`]}>\n {isLoading && activeItem.loadingText}\n </ActiveComponent>\n )\n }\n }, [activeComponent, menuEvents])\n\n const filteredMenuItems = useMemo(\n () =>\n menuItemsMap.filter((i) => i.name !== activeComponent && !i.excludedFor?.includes(fieldType)),\n [activeComponent, fieldType],\n )\n\n const MemoizedMenu = useMemo(() => {\n return ({ isLoading, onClose }) => (\n <div className={styles.menu}>\n {filteredMenuItems.map((i) => {\n const Action = i.component\n return (\n <Action\n disabled={isLoading}\n key={i.name}\n onClick={(data) => {\n if (i.name !== 'Settings') {\n setActiveComponent(i.name)\n }\n\n menuEvents[`on${i.name}`](data)\n onClose()\n }}\n >\n {isLoading && i.loadingText}\n </Action>\n )\n })}\n </div>\n )\n }, [filteredMenuItems, menuEvents])\n\n return {\n ActiveComponent: MemoizedActiveComponent,\n Menu: MemoizedMenu,\n }\n}\n"],"names":["useField","useFieldProps","React","useEffect","useMemo","useState","Compose","Proofread","Rephrase","menuItemsMap","styles","getActiveComponent","ac","useMenu","menuEvents","type","fieldType","path","pathFromContext","field","activeComponent","setActiveComponent","initialValue","value","some","i","excludedFor","includes","MemoizedActiveComponent","isLoading","ActiveComponent","activeItem","find","name","disabled","hideIcon","onClick","loadingText","filteredMenuItems","filter","MemoizedMenu","onClose","div","className","menu","map","Action","component","data","Menu"],"mappings":"AAAA;;AAEA,SAASA,QAAQ,EAAEC,aAAa,QAAQ,iBAAgB;AACxD,OAAOC,SAASC,SAAS,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAO;AAI3D,SAASC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,aAAY;AACzD,SAASC,YAAY,QAAQ,gBAAe;AAC5C,OAAOC,YAAY,qBAAoB;AAEvC,MAAMC,qBAAqB,CAACC;IAC1B,OAAQA;QACN,KAAK;YACH,OAAOL;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOF;QACT;YACE,OAAOE;IACX;AACF;AAEA,OAAO,MAAMK,UAAU,CAACC;IACtB,MAAM,EAAEC,MAAMC,SAAS,EAAEC,MAAMC,eAAe,EAAE,GAAGjB;IACnD,MAAMkB,QAAQnB,SAAS;QAAEiB,MAAMC;IAAgB;IAC/C,MAAM,CAACE,iBAAiBC,mBAAmB,GAAGhB,SAA0B;IAExE,MAAM,EAAEiB,YAAY,EAAEC,KAAK,EAAE,GAAGJ;IAEhChB,UAAU;QACR,IAAI,CAACoB,OAAO;YACVF,mBAAmB;YACnB;QACF;QAEA,IAAIZ,aAAae,IAAI,CAAC,CAACC,IAAMA,EAAEC,WAAW,EAAEC,SAASX,aAAa;YAChEK,mBAAmB;YACnB;QACF;QAEA,IAAI,OAAOE,UAAU,YAAYA,UAAUD,cAAc;YACvDD,mBAAmB;QACrB,OAAO;YACLA,mBAAmB;QACrB;IACF,GAAG;QAACC;QAAcC;QAAOP;KAAU;IAEnC,MAAMY,0BAA0BxB,QAAQ;QACtC,OAAO,CAAC,EAAEyB,SAAS,EAAE;YACnB,MAAMC,kBAAkBnB,mBAAmBS;YAC3C,MAAMW,aAAatB,aAAauB,IAAI,CAAC,CAACP,IAAMA,EAAEQ,IAAI,KAAKb;YACvD,qBACE,KAACU;gBAAgBI,UAAUL;gBAAWM,QAAQ;gBAACC,SAAStB,UAAU,CAAC,CAAC,EAAE,EAAEM,gBAAgB,CAAC,CAAC;0BACvFS,aAAaE,WAAWM,WAAW;;QAG1C;IACF,GAAG;QAACjB;QAAiBN;KAAW;IAEhC,MAAMwB,oBAAoBlC,QACxB,IACEK,aAAa8B,MAAM,CAAC,CAACd,IAAMA,EAAEQ,IAAI,KAAKb,mBAAmB,CAACK,EAAEC,WAAW,EAAEC,SAASX,aACpF;QAACI;QAAiBJ;KAAU;IAG9B,MAAMwB,eAAepC,QAAQ;QAC3B,OAAO,CAAC,EAAEyB,SAAS,EAAEY,OAAO,EAAE,iBAC5B,KAACC;gBAAIC,WAAWjC,OAAOkC,IAAI;0BACxBN,kBAAkBO,GAAG,CAAC,CAACpB;oBACtB,MAAMqB,SAASrB,EAAEsB,SAAS;oBAC1B,qBACE,KAACD;wBACCZ,UAAUL;wBAEVO,SAAS,CAACY;4BACR,IAAIvB,EAAEQ,IAAI,KAAK,YAAY;gCACzBZ,mBAAmBI,EAAEQ,IAAI;4BAC3B;4BAEAnB,UAAU,CAAC,CAAC,EAAE,EAAEW,EAAEQ,IAAI,CAAC,CAAC,CAAC,CAACe;4BAC1BP;wBACF;kCAECZ,aAAaJ,EAAEY,WAAW;uBAVtBZ,EAAEQ,IAAI;gBAajB;;IAGN,GAAG;QAACK;QAAmBxB;KAAW;IAElC,OAAO;QACLgB,iBAAiBF;QACjBqB,MAAMT;IACR;AACF,EAAC"}
@@ -0,0 +1,11 @@
1
+ import type { ActionMenuItems } from '../../../types.js';
2
+ type ActionCallbackParams = {
3
+ action: ActionMenuItems;
4
+ params?: unknown;
5
+ };
6
+ export declare const useGenerate: () => {
7
+ generate: (options?: ActionCallbackParams) => Promise<void | Response>;
8
+ isLoading: boolean;
9
+ };
10
+ export {};
11
+ //# sourceMappingURL=useGenerate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,mBAAmB,CAAA;AAa1E,KAAK,oBAAoB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,MAAM,CAAC,EAAE,OAAO,CAAA;CAAE,CAAA;AAGzE,eAAO,MAAM,WAAW;yBAuKH,oBAAoB;;CAoBxC,CAAA"}
@@ -0,0 +1,175 @@
1
+ import { useEditorConfigContext } from '@payloadcms/richtext-lexical/client';
2
+ import { useConfig, useDocumentInfo, useField, useFieldProps, useForm, useLocale } from '@payloadcms/ui';
3
+ import { useCompletion, experimental_useObject as useObject } from 'ai/react';
4
+ import { useCallback, useEffect } from 'react';
5
+ import { PLUGIN_API_ENDPOINT_GENERATE, PLUGIN_API_ENDPOINT_GENERATE_UPLOAD, PLUGIN_INSTRUCTIONS_TABLE } from '../../../defaults.js';
6
+ import { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js';
7
+ import { getFieldBySchemaPath } from '../../../utilities/getFieldBySchemaPath.js';
8
+ import { jsonSchemaToZod } from '../../../utilities/jsonToZod.js';
9
+ import { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js';
10
+ import { useHistory } from './useHistory.js';
11
+ //TODO: DONATION IDEA - Add a url to donate in cli when user installs the plugin and uses it for couple of times.
12
+ export const useGenerate = ()=>{
13
+ const { type, path: pathFromContext, schemaPath } = useFieldProps();
14
+ const editorConfigContext = useEditorConfigContext();
15
+ const { editor } = editorConfigContext;
16
+ const { docConfig } = useDocumentInfo();
17
+ const { setValue } = useField({
18
+ path: pathFromContext
19
+ });
20
+ const { set: setHistory } = useHistory();
21
+ const { id: instructionId } = useInstructions({
22
+ path: schemaPath
23
+ });
24
+ const { getData } = useForm();
25
+ const localFromContext = useLocale();
26
+ const { config: { collections } } = useConfig();
27
+ const collection = collections.find((collection)=>collection.slug === PLUGIN_INSTRUCTIONS_TABLE);
28
+ const { custom: { editorConfig } = {} } = collection.admin;
29
+ const { schema: DocumentSchema = {} } = editorConfig || {};
30
+ const lexicalZodSchema = jsonSchemaToZod(DocumentSchema);
31
+ const { isLoading: loadingObject, object, stop, submit } = useObject({
32
+ api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
33
+ onError: (error)=>{
34
+ console.error('Error generating object:', error);
35
+ },
36
+ onFinish: (result)=>{
37
+ if (result.object) {
38
+ setHistory(result.object);
39
+ setValue(result.object);
40
+ } else {
41
+ console.log('onFinish: result ', result);
42
+ }
43
+ },
44
+ schema: lexicalZodSchema
45
+ });
46
+ useEffect(()=>{
47
+ if (!object) return;
48
+ requestAnimationFrame(()=>{
49
+ if (!editor) {
50
+ setValue(object);
51
+ return;
52
+ }
53
+ // Currently this is being used as setValue for RichText component does not render new changes right away.
54
+ setSafeLexicalState(object, editor);
55
+ });
56
+ }, [
57
+ object
58
+ ]);
59
+ const { complete, completion, isLoading: loadingCompletion } = useCompletion({
60
+ api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,
61
+ onError: (error)=>{
62
+ console.error('Error generating text:', error);
63
+ },
64
+ onFinish: (prompt, result)=>{
65
+ setHistory(result);
66
+ },
67
+ streamProtocol: 'data'
68
+ });
69
+ useEffect(()=>{
70
+ if (!completion) return;
71
+ requestAnimationFrame(()=>{
72
+ setValue(completion);
73
+ });
74
+ }, [
75
+ completion
76
+ ]);
77
+ const streamObject = useCallback(({ action = 'Compose', params })=>{
78
+ const doc = getData();
79
+ const options = {
80
+ action,
81
+ actionParams: params,
82
+ instructionId
83
+ };
84
+ submit({
85
+ doc,
86
+ locale: localFromContext?.code,
87
+ options
88
+ });
89
+ }, [
90
+ getData,
91
+ localFromContext?.code,
92
+ instructionId
93
+ ]);
94
+ const streamText = useCallback(async ({ action = 'Compose', params })=>{
95
+ const doc = getData();
96
+ const options = {
97
+ action,
98
+ actionParams: params,
99
+ instructionId
100
+ };
101
+ await complete('', {
102
+ body: {
103
+ doc,
104
+ locale: localFromContext?.code,
105
+ options
106
+ }
107
+ });
108
+ }, [
109
+ getData,
110
+ localFromContext?.code,
111
+ instructionId
112
+ ]);
113
+ const generateUpload = useCallback(async ()=>{
114
+ const doc = getData();
115
+ const fieldInfo = getFieldBySchemaPath(docConfig, schemaPath);
116
+ return fetch(`/api${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {
117
+ body: JSON.stringify({
118
+ doc,
119
+ locale: localFromContext?.code,
120
+ options: {
121
+ instructionId,
122
+ uploadCollectionSlug: fieldInfo.relationTo || 'media'
123
+ }
124
+ }),
125
+ credentials: 'include',
126
+ headers: {
127
+ 'Content-Type': 'application/json'
128
+ },
129
+ method: 'POST'
130
+ }).then(async (uploadResponse)=>{
131
+ if (uploadResponse.ok) {
132
+ const { result } = await uploadResponse.json();
133
+ if (!result) throw new Error('generateUpload: Something went wrong');
134
+ setValue(result?.id);
135
+ setHistory(result?.id);
136
+ } else {
137
+ const { errors = [] } = await uploadResponse.json();
138
+ const errStr = errors.map((error)=>error.message).join(', ');
139
+ throw new Error(errStr);
140
+ }
141
+ return uploadResponse;
142
+ }).catch((error)=>{
143
+ console.error('Error generating your upload', error);
144
+ });
145
+ }, [
146
+ getData,
147
+ localFromContext?.code,
148
+ instructionId
149
+ ]);
150
+ const generate = useCallback(async (options)=>{
151
+ if (type === 'richText') {
152
+ return streamObject(options);
153
+ }
154
+ if ([
155
+ 'text',
156
+ 'textarea'
157
+ ].includes(type)) {
158
+ return streamText(options);
159
+ }
160
+ if (type === 'upload') {
161
+ return generateUpload();
162
+ }
163
+ }, [
164
+ generateUpload,
165
+ streamObject,
166
+ streamText,
167
+ type
168
+ ]);
169
+ return {
170
+ generate,
171
+ isLoading: loadingCompletion || loadingObject
172
+ };
173
+ };
174
+
175
+ //# sourceMappingURL=useGenerate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useGenerate.ts"],"sourcesContent":["import type { ClientCollectionConfig, UploadField } from 'payload'\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport {\n useConfig,\n useDocumentInfo,\n useField,\n useFieldProps,\n useForm,\n useLocale,\n} from '@payloadcms/ui'\nimport { useCompletion, experimental_useObject as useObject } from 'ai/react'\nimport { useCallback, useEffect } from 'react'\n\nimport type { ActionMenuItems, GenerateTextarea } from '../../../types.js'\n\nimport {\n PLUGIN_API_ENDPOINT_GENERATE,\n PLUGIN_API_ENDPOINT_GENERATE_UPLOAD,\n PLUGIN_INSTRUCTIONS_TABLE,\n} from '../../../defaults.js'\nimport { useInstructions } from '../../../providers/InstructionsProvider/useInstructions.js'\nimport { getFieldBySchemaPath } from '../../../utilities/getFieldBySchemaPath.js'\nimport { jsonSchemaToZod } from '../../../utilities/jsonToZod.js'\nimport { setSafeLexicalState } from '../../../utilities/setSafeLexicalState.js'\nimport { useHistory } from './useHistory.js'\n\ntype ActionCallbackParams = { action: ActionMenuItems; params?: unknown }\n\n//TODO: DONATION IDEA - Add a url to donate in cli when user installs the plugin and uses it for couple of times.\nexport const useGenerate = () => {\n const { type, path: pathFromContext, schemaPath } = useFieldProps()\n\n const editorConfigContext = useEditorConfigContext()\n const { editor } = editorConfigContext\n\n const { docConfig } = useDocumentInfo()\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const { set: setHistory } = useHistory()\n const { id: instructionId } = useInstructions({\n path: schemaPath,\n })\n\n const { getData } = useForm()\n const localFromContext = useLocale()\n const {\n config: { collections },\n } = useConfig()\n const collection = collections.find((collection) => collection.slug === PLUGIN_INSTRUCTIONS_TABLE)\n const { custom: { editorConfig } = {} } = collection.admin\n const { schema: DocumentSchema = {} } = editorConfig || {}\n const lexicalZodSchema = jsonSchemaToZod(DocumentSchema)\n\n const {\n isLoading: loadingObject,\n object,\n stop, // TODO: Implement this function\n submit,\n } = useObject({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating object:', error)\n },\n onFinish: (result) => {\n if (result.object) {\n setHistory(result.object)\n setValue(result.object)\n } else {\n console.log('onFinish: result ', result)\n }\n },\n schema: lexicalZodSchema,\n })\n\n useEffect(() => {\n if (!object) return\n\n requestAnimationFrame(() => {\n if (!editor) {\n setValue(object)\n return\n }\n\n // Currently this is being used as setValue for RichText component does not render new changes right away.\n setSafeLexicalState(object, editor)\n })\n }, [object])\n\n const {\n complete,\n completion,\n isLoading: loadingCompletion,\n } = useCompletion({\n api: `/api${PLUGIN_API_ENDPOINT_GENERATE}`,\n onError: (error) => {\n console.error('Error generating text:', error)\n },\n onFinish: (prompt, result) => {\n setHistory(result)\n },\n streamProtocol: 'data',\n })\n\n useEffect(() => {\n if (!completion) return\n\n requestAnimationFrame(() => {\n setValue(completion)\n })\n }, [completion])\n\n const streamObject = useCallback(\n ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n submit({\n doc,\n locale: localFromContext?.code,\n options,\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const streamText = useCallback(\n async ({ action = 'Compose', params }: ActionCallbackParams) => {\n const doc = getData()\n\n const options = {\n action,\n actionParams: params,\n instructionId,\n }\n\n await complete('', {\n body: {\n doc,\n locale: localFromContext?.code,\n options,\n },\n })\n },\n [getData, localFromContext?.code, instructionId],\n )\n\n const generateUpload = useCallback(async () => {\n const doc = getData()\n\n const fieldInfo = getFieldBySchemaPath(\n docConfig as ClientCollectionConfig,\n schemaPath,\n ) as UploadField\n\n return fetch(`/api${PLUGIN_API_ENDPOINT_GENERATE_UPLOAD}`, {\n body: JSON.stringify({\n doc,\n locale: localFromContext?.code,\n options: {\n instructionId,\n uploadCollectionSlug: fieldInfo.relationTo || 'media',\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 { result } = await uploadResponse.json()\n if (!result) throw new Error('generateUpload: Something went wrong')\n\n setValue(result?.id)\n setHistory(result?.id)\n } else {\n const { errors = [] } = await uploadResponse.json()\n const errStr = errors.map((error) => error.message).join(', ')\n throw new Error(errStr)\n }\n return uploadResponse\n })\n .catch((error) => {\n console.error('Error generating your upload', error)\n })\n }, [getData, localFromContext?.code, instructionId])\n\n const generate = useCallback(\n async (options?: ActionCallbackParams) => {\n if (type === 'richText') {\n return streamObject(options)\n }\n\n if (['text', 'textarea'].includes(type)) {\n return streamText(options)\n }\n\n if (type === 'upload') {\n return generateUpload()\n }\n },\n [generateUpload, streamObject, streamText, type],\n )\n\n return {\n generate,\n isLoading: loadingCompletion || loadingObject,\n }\n}\n"],"names":["useEditorConfigContext","useConfig","useDocumentInfo","useField","useFieldProps","useForm","useLocale","useCompletion","experimental_useObject","useObject","useCallback","useEffect","PLUGIN_API_ENDPOINT_GENERATE","PLUGIN_API_ENDPOINT_GENERATE_UPLOAD","PLUGIN_INSTRUCTIONS_TABLE","useInstructions","getFieldBySchemaPath","jsonSchemaToZod","setSafeLexicalState","useHistory","useGenerate","type","path","pathFromContext","schemaPath","editorConfigContext","editor","docConfig","setValue","set","setHistory","id","instructionId","getData","localFromContext","config","collections","collection","find","slug","custom","editorConfig","admin","schema","DocumentSchema","lexicalZodSchema","isLoading","loadingObject","object","stop","submit","api","onError","error","console","onFinish","result","log","requestAnimationFrame","complete","completion","loadingCompletion","prompt","streamProtocol","streamObject","action","params","doc","options","actionParams","locale","code","streamText","body","generateUpload","fieldInfo","fetch","JSON","stringify","uploadCollectionSlug","relationTo","credentials","headers","method","then","uploadResponse","ok","json","Error","errors","errStr","map","message","join","catch","generate","includes"],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ export declare const useHistory: () => {
2
+ canRedo: boolean;
3
+ canUndo: boolean;
4
+ currentValue: any;
5
+ redo: () => any;
6
+ set: (data: any) => any;
7
+ undo: () => any;
8
+ };
9
+ //# sourceMappingURL=useHistory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useHistory.d.ts","sourceRoot":"","sources":["../../../../src/ui/Compose/hooks/useHistory.ts"],"names":[],"mappings":"AAgBA,eAAO,MAAM,UAAU;;;;;gBAkEZ,GAAG;;CAoEb,CAAA"}
@@ -0,0 +1,171 @@
1
+ 'use client';
2
+ import { useDocumentInfo, useField, useFieldProps } from '@payloadcms/ui';
3
+ import { useCallback, useEffect } from 'react';
4
+ import { PLUGIN_NAME } from '../../../defaults.js';
5
+ const STORAGE_KEY = `${PLUGIN_NAME}-fields-history`;
6
+ export const useHistory = ()=>{
7
+ const { id } = useDocumentInfo();
8
+ const { path: pathFromContext, schemaPath } = useFieldProps();
9
+ const { value: currentFieldValue } = useField({
10
+ path: pathFromContext
11
+ });
12
+ const fieldKey = `${id}.${schemaPath}`;
13
+ const getLatestHistory = useCallback(()=>{
14
+ try {
15
+ // This condition is applied, as it was somehow triggering on server side
16
+ if (typeof localStorage !== 'undefined') {
17
+ return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}');
18
+ }
19
+ return {};
20
+ } catch (e) {
21
+ console.error('Error parsing history:', e);
22
+ return {};
23
+ }
24
+ }, []);
25
+ const saveToLocalStorage = useCallback((newGlobalHistory)=>{
26
+ if (typeof localStorage !== 'undefined') {
27
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory));
28
+ }
29
+ }, []);
30
+ // Clear previous history
31
+ const clearHistory = useCallback(()=>{
32
+ const latestHistory = {
33
+ ...getLatestHistory()
34
+ };
35
+ Object.keys(latestHistory).forEach((k)=>{
36
+ if (!k.startsWith(id.toString())) {
37
+ delete latestHistory[k];
38
+ }
39
+ });
40
+ saveToLocalStorage(latestHistory);
41
+ }, [
42
+ id,
43
+ fieldKey,
44
+ getLatestHistory,
45
+ saveToLocalStorage
46
+ ]);
47
+ useEffect(()=>{
48
+ // This is applied to clear out the document history which is not currently in use
49
+ clearHistory();
50
+ const latestHistory = getLatestHistory();
51
+ const { currentIndex, history } = latestHistory[fieldKey] || {
52
+ currentIndex: -1,
53
+ history: []
54
+ };
55
+ let newIndex = currentIndex;
56
+ if (currentIndex == -1) {
57
+ newIndex = 0;
58
+ if (currentFieldValue) {
59
+ history[newIndex] = currentFieldValue;
60
+ }
61
+ }
62
+ const newGlobalHistory = {
63
+ ...latestHistory,
64
+ [fieldKey]: {
65
+ currentIndex: newIndex,
66
+ history
67
+ }
68
+ };
69
+ saveToLocalStorage(newGlobalHistory);
70
+ }, [
71
+ fieldKey
72
+ ]);
73
+ const set = useCallback((data)=>{
74
+ const latestHistory = getLatestHistory();
75
+ const { currentIndex, history } = latestHistory[fieldKey] || {
76
+ currentIndex: -1,
77
+ history: []
78
+ };
79
+ const newHistory = [
80
+ ...history.slice(0, currentIndex + 1),
81
+ data
82
+ ];
83
+ const newGlobalHistory = {
84
+ ...latestHistory,
85
+ [fieldKey]: {
86
+ currentIndex: newHistory.length - 1,
87
+ history: newHistory
88
+ }
89
+ };
90
+ saveToLocalStorage(newGlobalHistory);
91
+ return data;
92
+ }, [
93
+ fieldKey,
94
+ getLatestHistory,
95
+ saveToLocalStorage
96
+ ]);
97
+ const undo = useCallback(()=>{
98
+ const latestHistory = getLatestHistory();
99
+ const { currentIndex, history } = latestHistory[fieldKey] || {
100
+ currentIndex: -1,
101
+ history: []
102
+ };
103
+ if (currentIndex > 0) {
104
+ const newIndex = currentIndex - 1;
105
+ const newValue = history[newIndex];
106
+ const newGlobalHistory = {
107
+ ...latestHistory,
108
+ [fieldKey]: {
109
+ currentIndex: newIndex,
110
+ history
111
+ }
112
+ };
113
+ saveToLocalStorage(newGlobalHistory);
114
+ return newValue;
115
+ }
116
+ return undefined;
117
+ }, [
118
+ fieldKey,
119
+ getLatestHistory,
120
+ saveToLocalStorage
121
+ ]);
122
+ const redo = useCallback(()=>{
123
+ const latestHistory = getLatestHistory();
124
+ const { currentIndex, history } = latestHistory[fieldKey] || {
125
+ currentIndex: -1,
126
+ history: []
127
+ };
128
+ if (currentIndex < history.length - 1) {
129
+ const newIndex = currentIndex + 1;
130
+ const newValue = history[newIndex];
131
+ const newGlobalHistory = {
132
+ ...latestHistory,
133
+ [fieldKey]: {
134
+ currentIndex: newIndex,
135
+ history
136
+ }
137
+ };
138
+ saveToLocalStorage(newGlobalHistory);
139
+ return newValue;
140
+ }
141
+ return undefined;
142
+ }, [
143
+ fieldKey,
144
+ getLatestHistory,
145
+ saveToLocalStorage
146
+ ]);
147
+ const getLatestFieldHistory = useCallback(()=>{
148
+ const latestHistory = getLatestHistory();
149
+ return latestHistory[fieldKey] || {
150
+ currentIndex: -1,
151
+ history: []
152
+ };
153
+ }, [
154
+ getLatestHistory,
155
+ fieldKey
156
+ ]);
157
+ const fieldHistory = getLatestFieldHistory();
158
+ const canUndo = fieldHistory.currentIndex > 0;
159
+ const canRedo = fieldHistory.currentIndex < fieldHistory.history.length - 1;
160
+ const currentValue = fieldHistory.history[fieldHistory.currentIndex];
161
+ return {
162
+ canRedo,
163
+ canUndo,
164
+ currentValue,
165
+ redo,
166
+ set,
167
+ undo
168
+ };
169
+ };
170
+
171
+ //# sourceMappingURL=useHistory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/ui/Compose/hooks/useHistory.ts"],"sourcesContent":["'use client'\n\nimport { useDocumentInfo, useField, useFieldProps } from '@payloadcms/ui'\nimport { useCallback, useEffect } from 'react'\n\nimport { PLUGIN_NAME } from '../../../defaults.js'\n\nconst STORAGE_KEY = `${PLUGIN_NAME}-fields-history`\n\ninterface HistoryState {\n [path: string]: {\n currentIndex: number\n history: any[]\n }\n}\n\nexport const useHistory = () => {\n const { id } = useDocumentInfo()\n const { path: pathFromContext, schemaPath } = useFieldProps()\n const { value: currentFieldValue } = useField<string>({\n path: pathFromContext,\n })\n\n const fieldKey = `${id}.${schemaPath}`\n\n const getLatestHistory = useCallback((): HistoryState => {\n try {\n // This condition is applied, as it was somehow triggering on server side\n if (typeof localStorage !== 'undefined') {\n return JSON.parse(localStorage.getItem(STORAGE_KEY) || '{}')\n }\n return {}\n } catch (e) {\n console.error('Error parsing history:', e)\n return {}\n }\n }, [])\n\n const saveToLocalStorage = useCallback((newGlobalHistory: HistoryState) => {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory))\n }\n }, [])\n\n // Clear previous history\n const clearHistory = useCallback(() => {\n const latestHistory = { ...getLatestHistory() }\n Object.keys(latestHistory).forEach((k) => {\n if (!k.startsWith(id.toString())) {\n delete latestHistory[k]\n }\n })\n saveToLocalStorage(latestHistory)\n }, [id, fieldKey, getLatestHistory, saveToLocalStorage])\n\n useEffect(() => {\n // This is applied to clear out the document history which is not currently in use\n clearHistory()\n\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n\n let newIndex = currentIndex\n if (currentIndex == -1) {\n newIndex = 0\n if (currentFieldValue) {\n history[newIndex] = currentFieldValue\n }\n }\n\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n\n saveToLocalStorage(newGlobalHistory)\n }, [fieldKey])\n\n const set = useCallback(\n (data: any) => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || {\n currentIndex: -1,\n history: [],\n }\n const newHistory = [...history.slice(0, currentIndex + 1), data]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newHistory.length - 1, history: newHistory },\n }\n saveToLocalStorage(newGlobalHistory)\n return data\n },\n [fieldKey, getLatestHistory, saveToLocalStorage],\n )\n\n const undo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex > 0) {\n const newIndex = currentIndex - 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const redo = useCallback(() => {\n const latestHistory = getLatestHistory()\n const { currentIndex, history } = latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n if (currentIndex < history.length - 1) {\n const newIndex = currentIndex + 1\n const newValue = history[newIndex]\n const newGlobalHistory = {\n ...latestHistory,\n [fieldKey]: { currentIndex: newIndex, history },\n }\n saveToLocalStorage(newGlobalHistory)\n return newValue\n }\n return undefined\n }, [fieldKey, getLatestHistory, saveToLocalStorage])\n\n const getLatestFieldHistory = useCallback(() => {\n const latestHistory = getLatestHistory()\n return latestHistory[fieldKey] || { currentIndex: -1, history: [] }\n }, [getLatestHistory, fieldKey])\n\n const fieldHistory = getLatestFieldHistory()\n\n const canUndo = fieldHistory.currentIndex > 0\n const canRedo = fieldHistory.currentIndex < fieldHistory.history.length - 1\n const currentValue = fieldHistory.history[fieldHistory.currentIndex]\n\n return {\n canRedo,\n canUndo,\n currentValue,\n redo,\n set,\n undo,\n }\n}\n"],"names":["useDocumentInfo","useField","useFieldProps","useCallback","useEffect","PLUGIN_NAME","STORAGE_KEY","useHistory","id","path","pathFromContext","schemaPath","value","currentFieldValue","fieldKey","getLatestHistory","localStorage","JSON","parse","getItem","e","console","error","saveToLocalStorage","newGlobalHistory","setItem","stringify","clearHistory","latestHistory","Object","keys","forEach","k","startsWith","toString","currentIndex","history","newIndex","set","data","newHistory","slice","length","undo","newValue","undefined","redo","getLatestFieldHistory","fieldHistory","canUndo","canRedo","currentValue"],"mappings":"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"}