@ai-stack/payloadcms 3.0.0-beta.104.1 → 3.0.0-beta.104.3

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 (90) hide show
  1. package/README.md +14 -0
  2. package/dist/ai/prompts.d.ts +1 -1
  3. package/dist/ai/prompts.d.ts.map +1 -1
  4. package/dist/ai/prompts.js +6 -3
  5. package/dist/ai/prompts.js.map +1 -1
  6. package/dist/exports/fields.d.ts +1 -1
  7. package/dist/exports/fields.d.ts.map +1 -1
  8. package/dist/exports/fields.js +1 -1
  9. package/dist/exports/fields.js.map +1 -1
  10. package/dist/fields/ComposeField/ComposeField.d.ts +4 -0
  11. package/dist/fields/ComposeField/ComposeField.d.ts.map +1 -0
  12. package/dist/fields/{DescriptionField/DescriptionField.js → ComposeField/ComposeField.js} +4 -4
  13. package/dist/fields/ComposeField/ComposeField.js.map +1 -0
  14. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts +2 -0
  15. package/dist/fields/LexicalEditor/ComposeFeatureComponent.d.ts.map +1 -0
  16. package/dist/fields/LexicalEditor/{ActionsFeatureComponent.js → ComposeFeatureComponent.js} +4 -4
  17. package/dist/fields/LexicalEditor/{ActionsFeatureComponent.js.map → ComposeFeatureComponent.js.map} +1 -1
  18. package/dist/fields/LexicalEditor/feature.client.d.ts +1 -4
  19. package/dist/fields/LexicalEditor/feature.client.d.ts.map +1 -1
  20. package/dist/fields/LexicalEditor/feature.client.js +2 -2
  21. package/dist/fields/LexicalEditor/feature.client.js.map +1 -1
  22. package/dist/fields/PromptEditorField/PromptEditorField.d.ts +2 -2
  23. package/dist/fields/PromptEditorField/PromptEditorField.d.ts.map +1 -1
  24. package/dist/fields/PromptEditorField/PromptEditorField.js.map +1 -1
  25. package/dist/fields/SelectField/SelectField.d.ts +2 -2
  26. package/dist/fields/SelectField/SelectField.d.ts.map +1 -1
  27. package/dist/fields/SelectField/SelectField.js.map +1 -1
  28. package/dist/libraries/handlebars/asyncHandlebars.js +1 -1
  29. package/dist/libraries/handlebars/asyncHandlebars.js.map +1 -1
  30. package/dist/plugin.d.ts.map +1 -1
  31. package/dist/plugin.js +13 -5
  32. package/dist/plugin.js.map +1 -1
  33. package/dist/ui/Compose/Compose.d.ts +9 -0
  34. package/dist/ui/Compose/Compose.d.ts.map +1 -0
  35. package/dist/ui/{Actions/Actions.js → Compose/Compose.js} +46 -38
  36. package/dist/ui/Compose/Compose.js.map +1 -0
  37. package/dist/ui/{Actions → Compose}/UndoRedoActions.d.ts.map +1 -1
  38. package/dist/ui/{Actions → Compose}/UndoRedoActions.js +15 -2
  39. package/dist/ui/Compose/UndoRedoActions.js.map +1 -0
  40. package/dist/ui/{Actions → Compose}/hooks/menu/Item.d.ts.map +1 -1
  41. package/dist/ui/{Actions → Compose}/hooks/menu/Item.js.map +1 -1
  42. package/dist/ui/Compose/hooks/menu/TranslateMenu.d.ts.map +1 -0
  43. package/dist/ui/{Actions → Compose}/hooks/menu/TranslateMenu.js.map +1 -1
  44. package/dist/ui/{Actions → Compose}/hooks/menu/items.d.ts.map +1 -1
  45. package/dist/ui/{Actions → Compose}/hooks/menu/items.js.map +1 -1
  46. package/dist/ui/{Actions → Compose}/hooks/menu/itemsMap.d.ts.map +1 -1
  47. package/dist/ui/{Actions → Compose}/hooks/menu/itemsMap.js.map +1 -1
  48. package/dist/ui/{Actions → Compose}/hooks/menu/useMenu.d.ts.map +1 -1
  49. package/dist/ui/{Actions → Compose}/hooks/menu/useMenu.js.map +1 -1
  50. package/dist/ui/{Actions → Compose}/hooks/useGenerate.d.ts.map +1 -1
  51. package/dist/ui/{Actions → Compose}/hooks/useGenerate.js +1 -2
  52. package/dist/ui/{Actions → Compose}/hooks/useGenerate.js.map +1 -1
  53. package/dist/ui/Compose/hooks/useHistory.d.ts.map +1 -0
  54. package/dist/ui/{Actions → Compose}/hooks/useHistory.js +3 -1
  55. package/dist/ui/Compose/hooks/useHistory.js.map +1 -0
  56. package/dist/utilities/setSafeLexicalState.d.ts +2 -2
  57. package/dist/utilities/setSafeLexicalState.d.ts.map +1 -1
  58. package/dist/utilities/setSafeLexicalState.js +5 -12
  59. package/dist/utilities/setSafeLexicalState.js.map +1 -1
  60. package/dist/utilities/updateFieldsConfig.d.ts.map +1 -1
  61. package/dist/utilities/updateFieldsConfig.js +4 -8
  62. package/dist/utilities/updateFieldsConfig.js.map +1 -1
  63. package/package.json +35 -59
  64. package/dist/fields/DescriptionField/DescriptionField.d.ts +0 -4
  65. package/dist/fields/DescriptionField/DescriptionField.d.ts.map +0 -1
  66. package/dist/fields/DescriptionField/DescriptionField.js.map +0 -1
  67. package/dist/fields/LexicalEditor/ActionsFeatureComponent.d.ts +0 -2
  68. package/dist/fields/LexicalEditor/ActionsFeatureComponent.d.ts.map +0 -1
  69. package/dist/ui/Actions/Actions.d.ts +0 -5
  70. package/dist/ui/Actions/Actions.d.ts.map +0 -1
  71. package/dist/ui/Actions/Actions.js.map +0 -1
  72. package/dist/ui/Actions/UndoRedoActions.js.map +0 -1
  73. package/dist/ui/Actions/hooks/menu/TranslateMenu.d.ts.map +0 -1
  74. package/dist/ui/Actions/hooks/useHistory.d.ts.map +0 -1
  75. package/dist/ui/Actions/hooks/useHistory.js.map +0 -1
  76. /package/dist/ui/{Actions → Compose}/UndoRedoActions.d.ts +0 -0
  77. /package/dist/ui/{Actions/actions.module.scss → Compose/compose.module.scss} +0 -0
  78. /package/dist/ui/{Actions → Compose}/hooks/menu/Item.d.ts +0 -0
  79. /package/dist/ui/{Actions → Compose}/hooks/menu/Item.js +0 -0
  80. /package/dist/ui/{Actions → Compose}/hooks/menu/TranslateMenu.d.ts +0 -0
  81. /package/dist/ui/{Actions → Compose}/hooks/menu/TranslateMenu.js +0 -0
  82. /package/dist/ui/{Actions → Compose}/hooks/menu/items.d.ts +0 -0
  83. /package/dist/ui/{Actions → Compose}/hooks/menu/items.js +0 -0
  84. /package/dist/ui/{Actions → Compose}/hooks/menu/itemsMap.d.ts +0 -0
  85. /package/dist/ui/{Actions → Compose}/hooks/menu/itemsMap.js +0 -0
  86. /package/dist/ui/{Actions → Compose}/hooks/menu/menu.module.scss +0 -0
  87. /package/dist/ui/{Actions → Compose}/hooks/menu/useMenu.d.ts +0 -0
  88. /package/dist/ui/{Actions → Compose}/hooks/menu/useMenu.js +0 -0
  89. /package/dist/ui/{Actions → Compose}/hooks/useGenerate.d.ts +0 -0
  90. /package/dist/ui/{Actions → Compose}/hooks/useHistory.d.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/Compose/Compose.tsx"],"sourcesContent":["'use client'\n\nimport type { FieldDescriptionClientProps } from 'payload'\nimport type { FC} from 'react';\n\nimport { useEditorConfigContext } from '@payloadcms/richtext-lexical/client'\nimport { FieldDescription, Popup, useDocumentDrawer, useField, useFieldProps } from '@payloadcms/ui'\nimport React, { useCallback, useEffect, useRef, useState } from 'react'\n\nimport { PLUGIN_INSTRUCTIONS_TABLE } from '../../defaults.js'\nimport { setSafeLexicalState } from '../../utilities/setSafeLexicalState.js'\nimport { PluginIcon } from '../Icons/Icons.js'\nimport { UndoRedoActions } from './UndoRedoActions.js'\nimport styles from './compose.module.scss'\nimport { useMenu } from './hooks/menu/useMenu.js'\nimport { useGenerate } from './hooks/useGenerate.js'\n\nfunction findParentWithClass(element, className) {\n // Base case: if the element is null or we've reached the top of the DOM\n if (!element || element === document.body) {\n return null\n }\n\n // Check if the current element has the class we're looking for\n if (element.classList.contains(className)) {\n return element\n }\n\n // Recursively call the function on the parent element\n return findParentWithClass(element.parentElement, className)\n}\n\ntype ComposeProps = {\n descriptionProps?: FieldDescriptionClientProps\n instructionId: string\n}\n\nexport const Compose: FC<ComposeProps> = (props) => {\n const [DocumentDrawer, _, { closeDrawer, openDrawer }] = useDocumentDrawer({\n id: props.instructionId,\n collectionSlug: PLUGIN_INSTRUCTIONS_TABLE,\n })\n\n const { type: fieldType, path: pathFromContext, schemaPath } = useFieldProps()\n const { editor: lexicalEditor, editorContainerRef } = useEditorConfigContext()\n\n // Below snippet is used to show/hide the actions menu on AI enabled fields\n const [input, setInput] = useState(null)\n const actionsRef = useRef(null)\n\n // Set input element for current field\n useEffect(() => {\n if (!actionsRef.current) return\n\n const fieldId = `field-${pathFromContext.replace(/\\./g, '__')}`\n const inputElement = document.getElementById(fieldId)\n\n if (!inputElement && fieldType === 'richText') {\n setInput(editorContainerRef.current)\n } else {\n actionsRef.current.setAttribute('for', fieldId)\n setInput(inputElement)\n }\n }, [pathFromContext, schemaPath, actionsRef, editorContainerRef])\n\n // Show or hide actions menu on field\n useEffect(() => {\n if (!input || !actionsRef.current) return\n\n actionsRef.current.classList.add(styles.actions_hidden)\n input.addEventListener('click', (event) => {\n document.querySelectorAll('.ai-plugin-active')?.forEach((element) => {\n const actionElement = element.querySelector(`.${styles.actions}`)\n if (actionElement) {\n actionElement.classList.add(styles.actions_hidden)\n element.classList.remove('ai-plugin-active')\n }\n })\n\n actionsRef.current.classList.remove(styles.actions_hidden)\n const parentWithClass = findParentWithClass(event.target, 'field-type')\n parentWithClass.classList.add('ai-plugin-active')\n })\n }, [input, actionsRef])\n\n const [isProcessing, setIsProcessing] = useState(false)\n const { generate, isLoading } = useGenerate()\n\n const { ActiveComponent, Menu } = useMenu({\n onCompose: async () => {\n console.log('Composing...')\n setIsProcessing(true)\n await generate({\n action: 'Compose',\n }).finally(() => {\n setIsProcessing(false)\n })\n },\n onExpand: async () => {\n console.log('Expanding...')\n await generate({\n action: 'Expand',\n })\n },\n onProofread: async () => {\n console.log('Proofreading...')\n await generate({\n action: 'Proofread',\n })\n },\n onRephrase: async () => {\n console.log('Rephrasing...')\n await generate({\n action: 'Rephrase',\n })\n },\n onSettings: openDrawer,\n onSimplify: async () => {\n console.log('Simplifying...')\n await generate({\n action: 'Simplify',\n })\n },\n onSummarize: async () => {\n console.log('Summarizing...')\n await generate({\n action: 'Summarize',\n })\n },\n onTranslate: async (data) => {\n console.log('Translating...')\n await generate({\n action: 'Translate',\n params: data,\n })\n },\n })\n\n const { setValue } = useField<string>({\n path: pathFromContext,\n })\n\n const setIfValueIsLexicalState = useCallback((val: any) => {\n if (val.root && lexicalEditor) {\n setSafeLexicalState(JSON.stringify(val), lexicalEditor)\n }\n\n // DO NOT PROVIDE lexicalEditor as a dependency, it freaks out and does not update the editor after first undo/redo\n }, [])\n\n return (\n <React.Fragment>\n <label\n className={`${styles.actions}`}\n onClick={(e) => e.preventDefault()}\n ref={actionsRef}\n role=\"presentation\"\n >\n <DocumentDrawer\n onSave={() => {\n closeDrawer()\n }}\n />\n <Popup\n button={<PluginIcon isLoading={isProcessing || isLoading} />}\n render={({ close }) => {\n return <Menu isLoading={isProcessing || isLoading} onClose={close} />\n }}\n verticalAlign=\"bottom\"\n />\n <ActiveComponent isLoading={isProcessing || isLoading} />\n <UndoRedoActions\n onChange={(val) => {\n setValue(val)\n setIfValueIsLexicalState(val)\n }}\n />\n </label>\n {/*Render incoming description field*/}\n {props.descriptionProps ? (\n <div>\n <FieldDescription {...props.descriptionProps} />\n </div>\n ) : null}\n </React.Fragment>\n )\n}\n"],"names":["useEditorConfigContext","FieldDescription","Popup","useDocumentDrawer","useField","useFieldProps","React","useCallback","useEffect","useRef","useState","PLUGIN_INSTRUCTIONS_TABLE","setSafeLexicalState","PluginIcon","UndoRedoActions","styles","useMenu","useGenerate","findParentWithClass","element","className","document","body","classList","contains","parentElement","Compose","props","DocumentDrawer","_","closeDrawer","openDrawer","id","instructionId","collectionSlug","type","fieldType","path","pathFromContext","schemaPath","editor","lexicalEditor","editorContainerRef","input","setInput","actionsRef","current","fieldId","replace","inputElement","getElementById","setAttribute","add","actions_hidden","addEventListener","event","querySelectorAll","forEach","actionElement","querySelector","actions","remove","parentWithClass","target","isProcessing","setIsProcessing","generate","isLoading","ActiveComponent","Menu","onCompose","console","log","action","finally","onExpand","onProofread","onRephrase","onSettings","onSimplify","onSummarize","onTranslate","data","params","setValue","setIfValueIsLexicalState","val","root","JSON","stringify","Fragment","label","onClick","e","preventDefault","ref","role","onSave","button","render","close","onClose","verticalAlign","onChange","descriptionProps","div"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"UndoRedoActions.d.ts","sourceRoot":"","sources":["../../../src/ui/Actions/UndoRedoActions.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,iBAAkB;IAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,4CAuCjF,CAAA"}
1
+ {"version":3,"file":"UndoRedoActions.d.ts","sourceRoot":"","sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"names":[],"mappings":"AAGA,eAAO,MAAM,eAAe,iBAAkB;IAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAA;CAAE,4CA0DjF,CAAA"}
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { useHistory } from './hooks/useHistory.js';
3
- import React, { useCallback } from 'react';
3
+ import React, { useCallback, useEffect, useState } from 'react';
4
4
  export const UndoRedoActions = ({ onChange })=>{
5
5
  const { canRedo, canUndo, redo, undo } = useHistory();
6
6
  const redoHistoryValue = useCallback((event)=>{
@@ -21,19 +21,32 @@ export const UndoRedoActions = ({ onChange })=>{
21
21
  }, [
22
22
  undo
23
23
  ]);
24
- if (!canUndo && !canRedo) return null;
24
+ // Delay rendering until the client-side hydration is complete
25
+ const [isMounted, setIsMounted] = useState(false);
26
+ useEffect(()=>{
27
+ setIsMounted(true);
28
+ }, []);
29
+ if (!isMounted || !canUndo && !canRedo) return null;
25
30
  return /*#__PURE__*/ _jsxs(_Fragment, {
26
31
  children: [
27
32
  /*#__PURE__*/ _jsx("button", {
28
33
  onClick: undoHistoryValue,
29
34
  type: "button",
30
35
  disabled: !canUndo,
36
+ className: `btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`,
37
+ style: {
38
+ marginBlock: 0
39
+ },
31
40
  children: "Undo"
32
41
  }),
33
42
  /*#__PURE__*/ _jsx("button", {
34
43
  onClick: redoHistoryValue,
35
44
  type: "button",
36
45
  disabled: !canRedo,
46
+ className: `btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`,
47
+ style: {
48
+ marginBlock: 0
49
+ },
37
50
  children: "Redo"
38
51
  })
39
52
  ]
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/ui/Compose/UndoRedoActions.tsx"],"sourcesContent":["import { useHistory } from './hooks/useHistory.js'\nimport React, { MouseEventHandler, useCallback, useEffect, useState } from 'react'\n\nexport const UndoRedoActions = ({ onChange }: { onChange: (val: unknown) => void }) => {\n const { canRedo, canUndo, redo, undo } = useHistory()\n\n const redoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = redo()\n if (value) {\n onChange(value)\n }\n },\n [redo],\n )\n\n const undoHistoryValue = useCallback<MouseEventHandler>(\n (event) => {\n event.stopPropagation()\n\n const value = undo()\n if (value) {\n onChange(value)\n }\n },\n [undo],\n )\n\n // Delay rendering until the client-side hydration is complete\n const [isMounted, setIsMounted] = useState(false)\n\n useEffect(() => {\n setIsMounted(true)\n }, [])\n\n if (!isMounted || (!canUndo && !canRedo)) return null\n\n return (\n <>\n <button\n onClick={undoHistoryValue}\n type=\"button\"\n disabled={!canUndo}\n className={`btn btn--size-small btn--style-secondary ${!canUndo && 'btn--disabled'}`}\n style={{ marginBlock: 0 }}\n >\n Undo\n </button>\n <button\n onClick={redoHistoryValue}\n type=\"button\"\n disabled={!canRedo}\n className={`btn btn--size-small btn--style-secondary ${!canRedo && 'btn--disabled'}`}\n style={{ marginBlock: 0 }}\n >\n Redo\n </button>\n </>\n )\n}\n"],"names":["useHistory","React","useCallback","useEffect","useState","UndoRedoActions","onChange","canRedo","canUndo","redo","undo","redoHistoryValue","event","stopPropagation","value","undoHistoryValue","isMounted","setIsMounted","button","onClick","type","disabled","className","style","marginBlock"],"mappings":";AAAA,SAASA,UAAU,QAAQ,wBAAuB;AAClD,OAAOC,SAA4BC,WAAW,EAAEC,SAAS,EAAEC,QAAQ,QAAQ,QAAO;AAElF,OAAO,MAAMC,kBAAkB,CAAC,EAAEC,QAAQ,EAAwC;IAChF,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,IAAI,EAAE,GAAGV;IAEzC,MAAMW,mBAAmBT,YACvB,CAACU;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQL;QACd,IAAIK,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACL;KAAK;IAGR,MAAMM,mBAAmBb,YACvB,CAACU;QACCA,MAAMC,eAAe;QAErB,MAAMC,QAAQJ;QACd,IAAII,OAAO;YACTR,SAASQ;QACX;IACF,GACA;QAACJ;KAAK;IAGR,8DAA8D;IAC9D,MAAM,CAACM,WAAWC,aAAa,GAAGb,SAAS;IAE3CD,UAAU;QACRc,aAAa;IACf,GAAG,EAAE;IAEL,IAAI,CAACD,aAAc,CAACR,WAAW,CAACD,SAAU,OAAO;IAEjD,qBACE;;0BACE,KAACW;gBACCC,SAASJ;gBACTK,MAAK;gBACLC,UAAU,CAACb;gBACXc,WAAW,CAAC,yCAAyC,EAAE,CAACd,WAAW,gBAAgB,CAAC;gBACpFe,OAAO;oBAAEC,aAAa;gBAAE;0BACzB;;0BAGD,KAACN;gBACCC,SAASR;gBACTS,MAAK;gBACLC,UAAU,CAACd;gBACXe,WAAW,CAAC,yCAAyC,EAAE,CAACf,WAAW,gBAAgB,CAAC;gBACpFgB,OAAO;oBAAEC,aAAa;gBAAE;0BACzB;;;;AAKP,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Actions/hooks/menu/Item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAA;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAKzD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAaxC,CAAA;AAED,eAAO,MAAM,cAAc,mIACyC,aAAa,6CAM7E,CAAA"}
1
+ {"version":3,"file":"Item.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/Item.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAe,MAAM,OAAO,CAAA;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAKzD,eAAO,MAAM,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAaxC,CAAA;AAED,eAAO,MAAM,cAAc,mIACyC,aAAa,6CAM7E,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Actions/hooks/menu/Item.tsx"],"sourcesContent":["import React, { memo } from 'react'\n\nimport type { BaseItemProps } from '../../../../types.js'\n\nimport { ArrowIcon } from '../../../Icons/Icons.js'\nimport styles from './menu.module.scss'\n\nexport const Item: React.FC<BaseItemProps> = memo(\n ({ children, disabled, onClick, isActive, ...rest }) => (\n <span\n className={styles.generate_button + ' ' + (isActive ? styles.active : '')}\n data-disabled={disabled}\n onClick={!disabled ? onClick : null}\n onKeyDown={!disabled ? onClick : null}\n role=\"presentation\"\n {...rest}\n >\n {children}\n </span>\n ),\n)\n\nexport const createMenuItem = (IconComponent, initialText) =>\n memo(({ children, disabled, hideIcon, onClick, isMenu, ...rest }: BaseItemProps) => (\n <Item disabled={disabled} onClick={onClick} {...rest}>\n {hideIcon || <IconComponent size={18} />}\n {children || <span className={styles.text}>{initialText}</span>}\n {isMenu && <ArrowIcon size={18} />}\n </Item>\n ))\n"],"names":["React","memo","ArrowIcon","styles","Item","children","disabled","onClick","isActive","rest","span","className","generate_button","active","data-disabled","onKeyDown","role","createMenuItem","IconComponent","initialText","hideIcon","isMenu","size","text"],"mappings":";AAAA,OAAOA,SAASC,IAAI,QAAQ,QAAO;AAInC,SAASC,SAAS,QAAQ,0BAAyB;AACnD,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,qBAAgCH,KAC3C,CAAC,EAAEI,QAAQ,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,EAAE,GAAGC,MAAM,iBACjD,KAACC;QACCC,WAAWR,OAAOS,eAAe,GAAG,MAAOJ,CAAAA,WAAWL,OAAOU,MAAM,GAAG,EAAC;QACvEC,iBAAeR;QACfC,SAAS,CAACD,WAAWC,UAAU;QAC/BQ,WAAW,CAACT,WAAWC,UAAU;QACjCS,MAAK;QACJ,GAAGP,IAAI;kBAEPJ;QAGN;AAED,OAAO,MAAMY,iBAAiB,CAACC,eAAeC,4BAC5ClB,KAAK,CAAC,EAAEI,QAAQ,EAAEC,QAAQ,EAAEc,QAAQ,EAAEb,OAAO,EAAEc,MAAM,EAAE,GAAGZ,MAAqB,iBAC7E,MAACL;YAAKE,UAAUA;YAAUC,SAASA;YAAU,GAAGE,IAAI;;gBACjDW,0BAAY,KAACF;oBAAcI,MAAM;;gBACjCjB,0BAAY,KAACK;oBAAKC,WAAWR,OAAOoB,IAAI;8BAAGJ;;gBAC3CE,wBAAU,KAACnB;oBAAUoB,MAAM;;;YAE9B"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/Item.tsx"],"sourcesContent":["import React, { memo } from 'react'\n\nimport type { BaseItemProps } from '../../../../types.js'\n\nimport { ArrowIcon } from '../../../Icons/Icons.js'\nimport styles from './menu.module.scss'\n\nexport const Item: React.FC<BaseItemProps> = memo(\n ({ children, disabled, onClick, isActive, ...rest }) => (\n <span\n className={styles.generate_button + ' ' + (isActive ? styles.active : '')}\n data-disabled={disabled}\n onClick={!disabled ? onClick : null}\n onKeyDown={!disabled ? onClick : null}\n role=\"presentation\"\n {...rest}\n >\n {children}\n </span>\n ),\n)\n\nexport const createMenuItem = (IconComponent, initialText) =>\n memo(({ children, disabled, hideIcon, onClick, isMenu, ...rest }: BaseItemProps) => (\n <Item disabled={disabled} onClick={onClick} {...rest}>\n {hideIcon || <IconComponent size={18} />}\n {children || <span className={styles.text}>{initialText}</span>}\n {isMenu && <ArrowIcon size={18} />}\n </Item>\n ))\n"],"names":["React","memo","ArrowIcon","styles","Item","children","disabled","onClick","isActive","rest","span","className","generate_button","active","data-disabled","onKeyDown","role","createMenuItem","IconComponent","initialText","hideIcon","isMenu","size","text"],"mappings":";AAAA,OAAOA,SAASC,IAAI,QAAQ,QAAO;AAInC,SAASC,SAAS,QAAQ,0BAAyB;AACnD,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,qBAAgCH,KAC3C,CAAC,EAAEI,QAAQ,EAAEC,QAAQ,EAAEC,OAAO,EAAEC,QAAQ,EAAE,GAAGC,MAAM,iBACjD,KAACC;QACCC,WAAWR,OAAOS,eAAe,GAAG,MAAOJ,CAAAA,WAAWL,OAAOU,MAAM,GAAG,EAAC;QACvEC,iBAAeR;QACfC,SAAS,CAACD,WAAWC,UAAU;QAC/BQ,WAAW,CAACT,WAAWC,UAAU;QACjCS,MAAK;QACJ,GAAGP,IAAI;kBAEPJ;QAGN;AAED,OAAO,MAAMY,iBAAiB,CAACC,eAAeC,4BAC5ClB,KAAK,CAAC,EAAEI,QAAQ,EAAEC,QAAQ,EAAEc,QAAQ,EAAEb,OAAO,EAAEc,MAAM,EAAE,GAAGZ,MAAqB,iBAC7E,MAACL;YAAKE,UAAUA;YAAUC,SAASA;YAAU,GAAGE,IAAI;;gBACjDW,0BAAY,KAACF;oBAAcI,MAAM;;gBACjCjB,0BAAY,KAACK;oBAAKC,WAAWR,OAAOoB,IAAI;8BAAGJ;;gBAC3CE,wBAAU,KAACnB;oBAAUoB,MAAM;;;YAE9B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TranslateMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa;;6CA0EzB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Actions/hooks/menu/TranslateMenu.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport locales from 'locale-codes'\n\nimport { Translate } from './items.js'\nimport { Item } from './Item.js'\nimport styles from './menu.module.scss'\n\nexport const TranslateMenu = ({ onClick }) => {\n const [show, setShow] = useState(false)\n\n const filteredLocales = locales.all.filter((a) => {\n return a.tag && a.location\n })\n\n const [languages, setLanguages] = useState(filteredLocales)\n const [inputFocus, setInputFocus] = useState(false)\n\n return (\n <div\n className={styles.menu}\n onMouseLeave={() => {\n if (!inputFocus) {\n setShow(false)\n }\n }}\n >\n <Translate\n onClick={() => {\n setShow(!show)\n }}\n onMouseEnter={() => setShow(true)}\n isMenu={true}\n isActive={show}\n ></Translate>\n <div className={styles.hoverMenu} data-show={show}>\n <div className={`${styles.menu} ${styles.subMenu}`}>\n <Item\n onClick={() => {}}\n style={{\n position: 'sticky',\n top: 0,\n padding: '0 0 5px 0',\n background: 'transparent',\n }}\n >\n <input\n className={styles.menuInput}\n placeholder={'Search...'}\n onFocus={() => setInputFocus(true)}\n onBlur={() => setInputFocus(false)}\n onChange={(event) => {\n const value = event.target.value\n setLanguages(\n filteredLocales.filter((l) => {\n const lowerCaseValue = value.toLowerCase()\n return (\n l.name.toLowerCase().startsWith(lowerCaseValue) ||\n l.location.toLowerCase().startsWith(lowerCaseValue) ||\n l.tag.toLowerCase().startsWith(lowerCaseValue)\n )\n }),\n )\n }}\n />\n </Item>\n {languages.map((locale) => {\n return (\n <Item\n key={locale.tag}\n onClick={() => {\n onClick({ locale: locale.tag })\n }}\n >\n <span className={styles.ellipsis}>{`${locale.location} (${locale.tag})`}</span>\n </Item>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["React","useState","locales","Translate","Item","styles","TranslateMenu","onClick","show","setShow","filteredLocales","all","filter","a","tag","location","languages","setLanguages","inputFocus","setInputFocus","div","className","menu","onMouseLeave","onMouseEnter","isMenu","isActive","hoverMenu","data-show","subMenu","style","position","top","padding","background","input","menuInput","placeholder","onFocus","onBlur","onChange","event","value","target","l","lowerCaseValue","toLowerCase","name","startsWith","map","locale","span","ellipsis"],"mappings":";AAAA,OAAOA,SAASC,QAAQ,QAAQ,QAAO;AACvC,OAAOC,aAAa,eAAc;AAElC,SAASC,SAAS,QAAQ,aAAY;AACtC,SAASC,IAAI,QAAQ,YAAW;AAChC,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,gBAAgB,CAAC,EAAEC,OAAO,EAAE;IACvC,MAAM,CAACC,MAAMC,QAAQ,GAAGR,SAAS;IAEjC,MAAMS,kBAAkBR,QAAQS,GAAG,CAACC,MAAM,CAAC,CAACC;QAC1C,OAAOA,EAAEC,GAAG,IAAID,EAAEE,QAAQ;IAC5B;IAEA,MAAM,CAACC,WAAWC,aAAa,GAAGhB,SAASS;IAC3C,MAAM,CAACQ,YAAYC,cAAc,GAAGlB,SAAS;IAE7C,qBACE,MAACmB;QACCC,WAAWhB,OAAOiB,IAAI;QACtBC,cAAc;YACZ,IAAI,CAACL,YAAY;gBACfT,QAAQ;YACV;QACF;;0BAEA,KAACN;gBACCI,SAAS;oBACPE,QAAQ,CAACD;gBACX;gBACAgB,cAAc,IAAMf,QAAQ;gBAC5BgB,QAAQ;gBACRC,UAAUlB;;0BAEZ,KAACY;gBAAIC,WAAWhB,OAAOsB,SAAS;gBAAEC,aAAWpB;0BAC3C,cAAA,MAACY;oBAAIC,WAAW,CAAC,EAAEhB,OAAOiB,IAAI,CAAC,CAAC,EAAEjB,OAAOwB,OAAO,CAAC,CAAC;;sCAChD,KAACzB;4BACCG,SAAS,KAAO;4BAChBuB,OAAO;gCACLC,UAAU;gCACVC,KAAK;gCACLC,SAAS;gCACTC,YAAY;4BACd;sCAEA,cAAA,KAACC;gCACCd,WAAWhB,OAAO+B,SAAS;gCAC3BC,aAAa;gCACbC,SAAS,IAAMnB,cAAc;gCAC7BoB,QAAQ,IAAMpB,cAAc;gCAC5BqB,UAAU,CAACC;oCACT,MAAMC,QAAQD,MAAME,MAAM,CAACD,KAAK;oCAChCzB,aACEP,gBAAgBE,MAAM,CAAC,CAACgC;wCACtB,MAAMC,iBAAiBH,MAAMI,WAAW;wCACxC,OACEF,EAAEG,IAAI,CAACD,WAAW,GAAGE,UAAU,CAACH,mBAChCD,EAAE7B,QAAQ,CAAC+B,WAAW,GAAGE,UAAU,CAACH,mBACpCD,EAAE9B,GAAG,CAACgC,WAAW,GAAGE,UAAU,CAACH;oCAEnC;gCAEJ;;;wBAGH7B,UAAUiC,GAAG,CAAC,CAACC;4BACd,qBACE,KAAC9C;gCAECG,SAAS;oCACPA,QAAQ;wCAAE2C,QAAQA,OAAOpC,GAAG;oCAAC;gCAC/B;0CAEA,cAAA,KAACqC;oCAAK9B,WAAWhB,OAAO+C,QAAQ;8CAAG,CAAC,EAAEF,OAAOnC,QAAQ,CAAC,EAAE,EAAEmC,OAAOpC,GAAG,CAAC,CAAC,CAAC;;+BALlEoC,OAAOpC,GAAG;wBAQrB;;;;;;AAKV,EAAC"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/TranslateMenu.tsx"],"sourcesContent":["import React, { useState } from 'react'\nimport locales from 'locale-codes'\n\nimport { Translate } from './items.js'\nimport { Item } from './Item.js'\nimport styles from './menu.module.scss'\n\nexport const TranslateMenu = ({ onClick }) => {\n const [show, setShow] = useState(false)\n\n const filteredLocales = locales.all.filter((a) => {\n return a.tag && a.location\n })\n\n const [languages, setLanguages] = useState(filteredLocales)\n const [inputFocus, setInputFocus] = useState(false)\n\n return (\n <div\n className={styles.menu}\n onMouseLeave={() => {\n if (!inputFocus) {\n setShow(false)\n }\n }}\n >\n <Translate\n onClick={() => {\n setShow(!show)\n }}\n onMouseEnter={() => setShow(true)}\n isMenu={true}\n isActive={show}\n ></Translate>\n <div className={styles.hoverMenu} data-show={show}>\n <div className={`${styles.menu} ${styles.subMenu}`}>\n <Item\n onClick={() => {}}\n style={{\n position: 'sticky',\n top: 0,\n padding: '0 0 5px 0',\n background: 'transparent',\n }}\n >\n <input\n className={styles.menuInput}\n placeholder={'Search...'}\n onFocus={() => setInputFocus(true)}\n onBlur={() => setInputFocus(false)}\n onChange={(event) => {\n const value = event.target.value\n setLanguages(\n filteredLocales.filter((l) => {\n const lowerCaseValue = value.toLowerCase()\n return (\n l.name.toLowerCase().startsWith(lowerCaseValue) ||\n l.location.toLowerCase().startsWith(lowerCaseValue) ||\n l.tag.toLowerCase().startsWith(lowerCaseValue)\n )\n }),\n )\n }}\n />\n </Item>\n {languages.map((locale) => {\n return (\n <Item\n key={locale.tag}\n onClick={() => {\n onClick({ locale: locale.tag })\n }}\n >\n <span className={styles.ellipsis}>{`${locale.location} (${locale.tag})`}</span>\n </Item>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n"],"names":["React","useState","locales","Translate","Item","styles","TranslateMenu","onClick","show","setShow","filteredLocales","all","filter","a","tag","location","languages","setLanguages","inputFocus","setInputFocus","div","className","menu","onMouseLeave","onMouseEnter","isMenu","isActive","hoverMenu","data-show","subMenu","style","position","top","padding","background","input","menuInput","placeholder","onFocus","onBlur","onChange","event","value","target","l","lowerCaseValue","toLowerCase","name","startsWith","map","locale","span","ellipsis"],"mappings":";AAAA,OAAOA,SAASC,QAAQ,QAAQ,QAAO;AACvC,OAAOC,aAAa,eAAc;AAElC,SAASC,SAAS,QAAQ,aAAY;AACtC,SAASC,IAAI,QAAQ,YAAW;AAChC,OAAOC,YAAY,qBAAoB;AAEvC,OAAO,MAAMC,gBAAgB,CAAC,EAAEC,OAAO,EAAE;IACvC,MAAM,CAACC,MAAMC,QAAQ,GAAGR,SAAS;IAEjC,MAAMS,kBAAkBR,QAAQS,GAAG,CAACC,MAAM,CAAC,CAACC;QAC1C,OAAOA,EAAEC,GAAG,IAAID,EAAEE,QAAQ;IAC5B;IAEA,MAAM,CAACC,WAAWC,aAAa,GAAGhB,SAASS;IAC3C,MAAM,CAACQ,YAAYC,cAAc,GAAGlB,SAAS;IAE7C,qBACE,MAACmB;QACCC,WAAWhB,OAAOiB,IAAI;QACtBC,cAAc;YACZ,IAAI,CAACL,YAAY;gBACfT,QAAQ;YACV;QACF;;0BAEA,KAACN;gBACCI,SAAS;oBACPE,QAAQ,CAACD;gBACX;gBACAgB,cAAc,IAAMf,QAAQ;gBAC5BgB,QAAQ;gBACRC,UAAUlB;;0BAEZ,KAACY;gBAAIC,WAAWhB,OAAOsB,SAAS;gBAAEC,aAAWpB;0BAC3C,cAAA,MAACY;oBAAIC,WAAW,CAAC,EAAEhB,OAAOiB,IAAI,CAAC,CAAC,EAAEjB,OAAOwB,OAAO,CAAC,CAAC;;sCAChD,KAACzB;4BACCG,SAAS,KAAO;4BAChBuB,OAAO;gCACLC,UAAU;gCACVC,KAAK;gCACLC,SAAS;gCACTC,YAAY;4BACd;sCAEA,cAAA,KAACC;gCACCd,WAAWhB,OAAO+B,SAAS;gCAC3BC,aAAa;gCACbC,SAAS,IAAMnB,cAAc;gCAC7BoB,QAAQ,IAAMpB,cAAc;gCAC5BqB,UAAU,CAACC;oCACT,MAAMC,QAAQD,MAAME,MAAM,CAACD,KAAK;oCAChCzB,aACEP,gBAAgBE,MAAM,CAAC,CAACgC;wCACtB,MAAMC,iBAAiBH,MAAMI,WAAW;wCACxC,OACEF,EAAEG,IAAI,CAACD,WAAW,GAAGE,UAAU,CAACH,mBAChCD,EAAE7B,QAAQ,CAAC+B,WAAW,GAAGE,UAAU,CAACH,mBACpCD,EAAE9B,GAAG,CAACgC,WAAW,GAAGE,UAAU,CAACH;oCAEnC;gCAEJ;;;wBAGH7B,UAAUiC,GAAG,CAAC,CAACC;4BACd,qBACE,KAAC9C;gCAECG,SAAS;oCACPA,QAAQ;wCAAE2C,QAAQA,OAAOpC,GAAG;oCAAC;gCAC/B;0CAEA,cAAA,KAACqC;oCAAK9B,WAAWhB,OAAO+C,QAAQ;8CAAG,CAAC,EAAEF,OAAOnC,QAAQ,CAAC,EAAE,EAAEmC,OAAOpC,GAAG,CAAC,CAAC,CAAC;;+BALlEoC,OAAOpC,GAAG;wBAQrB;;;;;;AAKV,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Actions/hooks/menu/items.tsx"],"names":[],"mappings":"AAYA,eAAO,MAAM,SAAS,4LAA8C,CAAA;AACpE,eAAO,MAAM,QAAQ,4LAA2C,CAAA;AAChE,eAAO,MAAM,SAAS,4LAA6C,CAAA;AACnE,eAAO,MAAM,MAAM,4LAA0C,CAAA;AAC7D,eAAO,MAAM,SAAS,4LAA6C,CAAA;AACnE,eAAO,MAAM,QAAQ,4LAA0C,CAAA;AAC/D,eAAO,MAAM,OAAO,4LAA4C,CAAA;AAChE,eAAO,MAAM,QAAQ,4LAAuC,CAAA"}
1
+ {"version":3,"file":"items.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/items.tsx"],"names":[],"mappings":"AAYA,eAAO,MAAM,SAAS,4LAA8C,CAAA;AACpE,eAAO,MAAM,QAAQ,4LAA2C,CAAA;AAChE,eAAO,MAAM,SAAS,4LAA6C,CAAA;AACnE,eAAO,MAAM,MAAM,4LAA0C,CAAA;AAC7D,eAAO,MAAM,SAAS,4LAA6C,CAAA;AACnE,eAAO,MAAM,QAAQ,4LAA0C,CAAA;AAC/D,eAAO,MAAM,OAAO,4LAA4C,CAAA;AAChE,eAAO,MAAM,QAAQ,4LAAuC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Actions/hooks/menu/items.tsx"],"sourcesContent":["import {\n DocsAddOnIcon,\n EditNoteIcon,\n SegmentIcon,\n SpellCheckIcon,\n StylusNoteIcon,\n SummarizeIcon,\n TranslateIcon,\n TuneIcon,\n} from '../../../Icons/Icons.js'\nimport { createMenuItem } from './Item.js'\n\nexport const Proofread = createMenuItem(SpellCheckIcon, 'Proofread')\nexport const Rephrase = createMenuItem(EditNoteIcon, 'Rephrase')\nexport const Translate = createMenuItem(TranslateIcon, 'Translate')\nexport const Expand = createMenuItem(DocsAddOnIcon, 'Expand')\nexport const Summarize = createMenuItem(SummarizeIcon, 'Summarize')\nexport const Simplify = createMenuItem(SegmentIcon, 'Simplify')\nexport const Compose = createMenuItem(StylusNoteIcon, 'Compose')\nexport const Settings = createMenuItem(TuneIcon, 'Settings')\n"],"names":["DocsAddOnIcon","EditNoteIcon","SegmentIcon","SpellCheckIcon","StylusNoteIcon","SummarizeIcon","TranslateIcon","TuneIcon","createMenuItem","Proofread","Rephrase","Translate","Expand","Summarize","Simplify","Compose","Settings"],"mappings":"AAAA,SACEA,aAAa,EACbC,YAAY,EACZC,WAAW,EACXC,cAAc,EACdC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,QAAQ,QACH,0BAAyB;AAChC,SAASC,cAAc,QAAQ,YAAW;AAE1C,OAAO,MAAMC,YAAYD,eAAeL,gBAAgB,aAAY;AACpE,OAAO,MAAMO,WAAWF,eAAeP,cAAc,YAAW;AAChE,OAAO,MAAMU,YAAYH,eAAeF,eAAe,aAAY;AACnE,OAAO,MAAMM,SAASJ,eAAeR,eAAe,UAAS;AAC7D,OAAO,MAAMa,YAAYL,eAAeH,eAAe,aAAY;AACnE,OAAO,MAAMS,WAAWN,eAAeN,aAAa,YAAW;AAC/D,OAAO,MAAMa,UAAUP,eAAeJ,gBAAgB,WAAU;AAChE,OAAO,MAAMY,WAAWR,eAAeD,UAAU,YAAW"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/items.tsx"],"sourcesContent":["import {\n DocsAddOnIcon,\n EditNoteIcon,\n SegmentIcon,\n SpellCheckIcon,\n StylusNoteIcon,\n SummarizeIcon,\n TranslateIcon,\n TuneIcon,\n} from '../../../Icons/Icons.js'\nimport { createMenuItem } from './Item.js'\n\nexport const Proofread = createMenuItem(SpellCheckIcon, 'Proofread')\nexport const Rephrase = createMenuItem(EditNoteIcon, 'Rephrase')\nexport const Translate = createMenuItem(TranslateIcon, 'Translate')\nexport const Expand = createMenuItem(DocsAddOnIcon, 'Expand')\nexport const Summarize = createMenuItem(SummarizeIcon, 'Summarize')\nexport const Simplify = createMenuItem(SegmentIcon, 'Simplify')\nexport const Compose = createMenuItem(StylusNoteIcon, 'Compose')\nexport const Settings = createMenuItem(TuneIcon, 'Settings')\n"],"names":["DocsAddOnIcon","EditNoteIcon","SegmentIcon","SpellCheckIcon","StylusNoteIcon","SummarizeIcon","TranslateIcon","TuneIcon","createMenuItem","Proofread","Rephrase","Translate","Expand","Summarize","Simplify","Compose","Settings"],"mappings":"AAAA,SACEA,aAAa,EACbC,YAAY,EACZC,WAAW,EACXC,cAAc,EACdC,cAAc,EACdC,aAAa,EACbC,aAAa,EACbC,QAAQ,QACH,0BAAyB;AAChC,SAASC,cAAc,QAAQ,YAAW;AAE1C,OAAO,MAAMC,YAAYD,eAAeL,gBAAgB,aAAY;AACpE,OAAO,MAAMO,WAAWF,eAAeP,cAAc,YAAW;AAChE,OAAO,MAAMU,YAAYH,eAAeF,eAAe,aAAY;AACnE,OAAO,MAAMM,SAASJ,eAAeR,eAAe,UAAS;AAC7D,OAAO,MAAMa,YAAYL,eAAeH,eAAe,aAAY;AACnE,OAAO,MAAMS,WAAWN,eAAeN,aAAa,YAAW;AAC/D,OAAO,MAAMa,UAAUP,eAAeJ,gBAAgB,WAAU;AAChE,OAAO,MAAMY,WAAWR,eAAeD,UAAU,YAAW"}
@@ -1 +1 @@
1
- {"version":3,"file":"itemsMap.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Actions/hooks/menu/itemsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAK1E,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,eAAe,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAoB1C,CAAA"}
1
+ {"version":3,"file":"itemsMap.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAK1E,KAAK,gBAAgB,GAAG;IACtB,SAAS,EAAE,KAAK,CAAC,EAAE,CAAC,aAAa,CAAC,CAAA;IAClC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,IAAI,EAAE,eAAe,CAAA;CACtB,CAAA;AAED,eAAO,MAAM,YAAY,EAAE,gBAAgB,EAoB1C,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Actions/hooks/menu/itemsMap.ts"],"sourcesContent":["import React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: TranslateMenu,\n excludedFor: ['upload'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["React","Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","TranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AAIzB,SAASC,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,aAAa,QAAQ,qBAAoB;AASlD,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAe;IAChG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAa;IAC5F;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;SAAS;QACvBC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;SAAO;QAAEC,aAAa;IAAY;IAC/F;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;SAAW;QAC3CC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAc;IAC7F;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}
1
+ {"version":3,"sources":["../../../../../src/ui/Compose/hooks/menu/itemsMap.ts"],"sourcesContent":["import React from 'react'\n\nimport type { ActionMenuItems, BaseItemProps } from '../../../../types.js'\n\nimport { Compose, Expand, Proofread, Rephrase, Settings, Simplify, Summarize } from './items.js'\nimport { TranslateMenu } from './TranslateMenu.js'\n\ntype MenuItemsMapType = {\n component: React.FC<BaseItemProps>\n excludedFor?: string[]\n loadingText?: string\n name: ActionMenuItems\n}\n\nexport const menuItemsMap: MenuItemsMapType[] = [\n { name: 'Proofread', component: Proofread, excludedFor: ['upload'], loadingText: 'Proofreading' },\n { name: 'Rephrase', component: Rephrase, excludedFor: ['upload'], loadingText: 'Rephrasing' },\n {\n name: 'Translate',\n component: TranslateMenu,\n excludedFor: ['upload'],\n loadingText: 'Translating',\n },\n { name: 'Expand', component: Expand, excludedFor: ['upload', 'text'], loadingText: 'Expanding' },\n {\n // Turned off - WIP\n name: 'Summarize',\n component: Summarize,\n excludedFor: ['upload', 'text', 'richText'],\n loadingText: 'Summarizing',\n },\n { name: 'Simplify', component: Simplify, excludedFor: ['upload'], loadingText: 'Simplifying' },\n { name: 'Compose', component: Compose, loadingText: 'Composing' },\n { name: 'Settings', component: Settings },\n]\n"],"names":["React","Compose","Expand","Proofread","Rephrase","Settings","Simplify","Summarize","TranslateMenu","menuItemsMap","name","component","excludedFor","loadingText"],"mappings":"AAAA,OAAOA,WAAW,QAAO;AAIzB,SAASC,OAAO,EAAEC,MAAM,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,SAAS,QAAQ,aAAY;AAChG,SAASC,aAAa,QAAQ,qBAAoB;AASlD,OAAO,MAAMC,eAAmC;IAC9C;QAAEC,MAAM;QAAaC,WAAWR;QAAWS,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAe;IAChG;QAAEH,MAAM;QAAYC,WAAWP;QAAUQ,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAa;IAC5F;QACEH,MAAM;QACNC,WAAWH;QACXI,aAAa;YAAC;SAAS;QACvBC,aAAa;IACf;IACA;QAAEH,MAAM;QAAUC,WAAWT;QAAQU,aAAa;YAAC;YAAU;SAAO;QAAEC,aAAa;IAAY;IAC/F;QACE,mBAAmB;QACnBH,MAAM;QACNC,WAAWJ;QACXK,aAAa;YAAC;YAAU;YAAQ;SAAW;QAC3CC,aAAa;IACf;IACA;QAAEH,MAAM;QAAYC,WAAWL;QAAUM,aAAa;YAAC;SAAS;QAAEC,aAAa;IAAc;IAC7F;QAAEH,MAAM;QAAWC,WAAWV;QAASY,aAAa;IAAY;IAChE;QAAEH,MAAM;QAAYC,WAAWN;IAAS;CACzC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"useMenu.d.ts","sourceRoot":"","sources":["../../../../../src/ui/Actions/hooks/menu/useMenu.tsx"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAmB,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAmB1E,eAAO,MAAM,OAAO,eAAgB,aAAa;;;;;;;;CAyEhD,CAAA"}
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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/ui/Actions/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"}
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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useGenerate.d.ts","sourceRoot":"","sources":["../../../../src/ui/Actions/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"}
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"}
@@ -145,8 +145,7 @@ export const useGenerate = ()=>{
145
145
  }, [
146
146
  getData,
147
147
  localFromContext?.code,
148
- instructionId,
149
- setValue
148
+ instructionId
150
149
  ]);
151
150
  const generate = useCallback(async (options)=>{
152
151
  if (type === 'richText') {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/ui/Actions/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, setValue])\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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"}
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 @@
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"}
@@ -23,7 +23,9 @@ export const useHistory = ()=>{
23
23
  }
24
24
  }, []);
25
25
  const saveToLocalStorage = useCallback((newGlobalHistory)=>{
26
- localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory));
26
+ if (typeof localStorage !== 'undefined') {
27
+ localStorage.setItem(STORAGE_KEY, JSON.stringify(newGlobalHistory));
28
+ }
27
29
  }, []);
28
30
  // Clear previous history
29
31
  const clearHistory = useCallback(()=>{
@@ -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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"}
@@ -1,5 +1,5 @@
1
- import { LexicalEditor } from 'lexical';
2
- type EditorAction = 'update' | 'replace';
1
+ import type { LexicalEditor } from 'lexical';
2
+ type EditorAction = 'replace' | 'update';
3
3
  export declare const setSafeLexicalState: (state: any, editorInstance: LexicalEditor, action?: EditorAction) => void;
4
4
  export {};
5
5
  //# sourceMappingURL=setSafeLexicalState.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"setSafeLexicalState.d.ts","sourceRoot":"","sources":["../../src/utilities/setSafeLexicalState.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAIvC,KAAK,YAAY,GAAG,QAAQ,GAAG,SAAS,CAAA;AAExC,eAAO,MAAM,mBAAmB,+BAEd,aAAa,WACrB,YAAY,SAoBrB,CAAA"}
1
+ {"version":3,"file":"setSafeLexicalState.d.ts","sourceRoot":"","sources":["../../src/utilities/setSafeLexicalState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AAE5C,KAAK,YAAY,GAAG,SAAS,GAAG,QAAQ,CAAA;AAExC,eAAO,MAAM,mBAAmB,+BAEd,aAAa,WACrB,YAAY,SAYrB,CAAA"}
@@ -1,19 +1,12 @@
1
- import { $getRoot } from 'lexical';
2
1
  export const setSafeLexicalState = (state, editorInstance, action = 'replace')=>{
3
2
  try {
4
3
  const editorState = editorInstance.parseEditorState(state);
5
- if (editorState.isEmpty()) return;
6
- editorInstance.update(()=>{
7
- const root = $getRoot();
8
- root.clear() //TODO: this is hack to prevent reconciliation error - find a way
9
- ;
10
- editorInstance.setEditorState(editorState);
11
- }, {
12
- discrete: true
13
- });
4
+ if (editorState.isEmpty()) {
5
+ return;
6
+ }
7
+ editorInstance.setEditorState(editorState);
14
8
  } catch (e) {
15
- // console.error('Error setting object:', e)
16
- // setValue(object) //TODO: This breaks the editor find a better way to handle objects that are not valid
9
+ // console.error('Shh....:', e)
17
10
  }
18
11
  };
19
12
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import { LexicalEditor } from 'lexical'\n\nimport { $getRoot } from 'lexical'\n\ntype EditorAction = 'update' | 'replace'\n\nexport const setSafeLexicalState = (\n state,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state)\n if (editorState.isEmpty()) return\n\n editorInstance.update(\n () => {\n const root = $getRoot()\n root.clear() //TODO: this is hack to prevent reconciliation error - find a way\n editorInstance.setEditorState(editorState)\n },\n {\n discrete: true,\n },\n )\n } catch (e) {\n // console.error('Error setting object:', e)\n // setValue(object) //TODO: This breaks the editor find a better way to handle objects that are not valid\n }\n}\n"],"names":["$getRoot","setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","update","root","clear","setEditorState","discrete","e"],"mappings":"AAEA,SAASA,QAAQ,QAAQ,UAAS;AAIlC,OAAO,MAAMC,sBAAsB,CACjCC,OACAC,gBACAC,SAAuB,SAAS;IAEhC,IAAI;QACF,MAAMC,cAAcF,eAAeG,gBAAgB,CAACJ;QACpD,IAAIG,YAAYE,OAAO,IAAI;QAE3BJ,eAAeK,MAAM,CACnB;YACE,MAAMC,OAAOT;YACbS,KAAKC,KAAK,GAAG,iEAAiE;;YAC9EP,eAAeQ,cAAc,CAACN;QAChC,GACA;YACEO,UAAU;QACZ;IAEJ,EAAE,OAAOC,GAAG;IACV,4CAA4C;IAC5C,yGAAyG;IAC3G;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/setSafeLexicalState.ts"],"sourcesContent":["import type { LexicalEditor } from 'lexical'\n\ntype EditorAction = 'replace' | 'update'\n\nexport const setSafeLexicalState = (\n state,\n editorInstance: LexicalEditor,\n action: EditorAction = 'replace',\n) => {\n try {\n const editorState = editorInstance.parseEditorState(state)\n if (editorState.isEmpty()) {\n return\n }\n\n editorInstance.setEditorState(editorState)\n } catch (e) {\n // console.error('Shh....:', e)\n }\n}\n"],"names":["setSafeLexicalState","state","editorInstance","action","editorState","parseEditorState","isEmpty","setEditorState","e"],"mappings":"AAIA,OAAO,MAAMA,sBAAsB,CACjCC,OACAC,gBACAC,SAAuB,SAAS;IAEhC,IAAI;QACF,MAAMC,cAAcF,eAAeG,gBAAgB,CAACJ;QACpD,IAAIG,YAAYE,OAAO,IAAI;YACzB;QACF;QAEAJ,eAAeK,cAAc,CAACH;IAChC,EAAE,OAAOI,GAAG;IACV,+BAA+B;IACjC;AACF,EAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"updateFieldsConfig.d.ts","sourceRoot":"","sources":["../../src/utilities/updateFieldsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,uBAAuB,EAAE,gBAAgB,CAAA;CAC1C;AAED,eAAO,MAAM,kBAAkB,qBAAsB,gBAAgB,KAAG,kBAgGvE,CAAA"}
1
+ {"version":3,"file":"updateFieldsConfig.d.ts","sourceRoot":"","sources":["../../src/utilities/updateFieldsConfig.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAA;AAE/C,UAAU,kBAAkB;IAC1B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,uBAAuB,EAAE,gBAAgB,CAAA;CAC1C;AAED,eAAO,MAAM,kBAAkB,qBAAsB,gBAAgB,KAAG,kBA0FvE,CAAA"}
@@ -31,8 +31,10 @@ export const updateFieldsConfig = (collectionConfig)=>{
31
31
  'upload'
32
32
  ].includes(field.type)) {
33
33
  let customField = {};
34
+ // Custom fields don't fully adhere to the Payload schema, making it difficult to
35
+ // determine which components support injecting ComposeField as a Description.
34
36
  if (field.admin?.components?.Field || field.admin?.components?.Description) {
35
- customComponentsFound = true;
37
+ // TODO: Do something?
36
38
  }
37
39
  return {
38
40
  ...field,
@@ -40,7 +42,7 @@ export const updateFieldsConfig = (collectionConfig)=>{
40
42
  ...field.admin,
41
43
  components: {
42
44
  ...field.admin?.components || {},
43
- Description: '@ai-stack/payloadcms/fields#DescriptionField',
45
+ Description: '@ai-stack/payloadcms/fields#ComposeField',
44
46
  ...customField
45
47
  }
46
48
  }
@@ -78,12 +80,6 @@ export const updateFieldsConfig = (collectionConfig)=>{
78
80
  ...collectionConfig,
79
81
  fields: collectionConfig.fields.map((field)=>updateField(field))
80
82
  };
81
- if (customComponentsFound) {
82
- console.warn(`\n— AI Plugin Alert 🚨:
83
- Uh-oh, custom component(s) spotted! We might not be able to inject the AI Composer automatically for these components 🤖.
84
- No worries, though! You can add it manually using below path:
85
- '@ai-stack/payloadcms/fields#DescriptionField'.\n`);
86
- }
87
83
  return {
88
84
  schemaPathMap,
89
85
  updatedCollectionConfig
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utilities/updateFieldsConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\ninterface UpdateFieldsConfig {\n schemaPathMap: Record<string, string>\n updatedCollectionConfig: CollectionConfig\n}\n\nexport const updateFieldsConfig = (collectionConfig: CollectionConfig): UpdateFieldsConfig => {\n let schemaPathMap = {}\n let customComponentsFound = false\n function updateField(field: any, parentPath = ''): any {\n const currentPath = parentPath ? `${parentPath}.${field.name}` : field.name\n const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`\n\n if (field.admin?.disabled || field.admin?.readOnly || field.admin?.hidden) {\n return field\n }\n\n // Map field path for global fieldInstructionsMap to load related instructions\n // This is done due to save extra API call to get instructions when Field components are loaded in admin\n // Doing is will only call instructions data when user clicks on settings\n if (['richText', 'text', 'textarea', 'upload'].includes(field.type)) {\n schemaPathMap = {\n ...schemaPathMap,\n [currentSchemaPath]: {\n type: field.type,\n label: field.label || field.name,\n },\n }\n }\n\n // Inject AI actions, richText is not included here as it has to be explicitly defined by user\n if (['text', 'textarea', 'upload'].includes(field.type)) {\n let customField = {}\n if (field.admin?.components?.Field || field.admin?.components?.Description) {\n customComponentsFound = true\n }\n\n return {\n ...field,\n admin: {\n ...field.admin,\n components: {\n ...(field.admin?.components || {}),\n Description: '@ai-stack/payloadcms/fields#DescriptionField',\n ...customField,\n },\n },\n }\n }\n\n if (field.fields) {\n return {\n ...field,\n fields: field.fields.map((subField: any) => updateField(subField, currentPath)),\n }\n }\n\n if (field.tabs) {\n return {\n ...field,\n tabs: field.tabs.map((tab: any) => {\n return {\n ...tab,\n fields: tab.fields.map((subField: any) => updateField(subField, tab.name)),\n }\n }),\n }\n }\n\n if (field.blocks) {\n return {\n ...field,\n blocks: field.blocks.map((block: any) => ({\n ...block,\n fields: block.fields.map((subField: any) =>\n updateField(subField, `${currentPath}.${block.slug}`),\n ),\n })),\n }\n }\n\n return field\n }\n\n const updatedCollectionConfig = {\n ...collectionConfig,\n fields: collectionConfig.fields.map((field) => updateField(field)),\n }\n\n if (customComponentsFound) {\n console.warn(\n `\\n— AI Plugin Alert 🚨:\n Uh-oh, custom component(s) spotted! We might not be able to inject the AI Composer automatically for these components 🤖.\n No worries, though! You can add it manually using below path:\n '@ai-stack/payloadcms/fields#DescriptionField'.\\n`,\n )\n }\n\n return {\n schemaPathMap,\n updatedCollectionConfig,\n }\n}\n"],"names":["updateFieldsConfig","collectionConfig","schemaPathMap","customComponentsFound","updateField","field","parentPath","currentPath","name","currentSchemaPath","slug","admin","disabled","readOnly","hidden","includes","type","label","customField","components","Field","Description","fields","map","subField","tabs","tab","blocks","block","updatedCollectionConfig","console","warn"],"mappings":"AAOA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,IAAIC,gBAAgB,CAAC;IACrB,IAAIC,wBAAwB;IAC5B,SAASC,YAAYC,KAAU,EAAEC,aAAa,EAAE;QAC9C,MAAMC,cAAcD,aAAa,CAAC,EAAEA,WAAW,CAAC,EAAED,MAAMG,IAAI,CAAC,CAAC,GAAGH,MAAMG,IAAI;QAC3E,MAAMC,oBAAoB,CAAC,EAAER,iBAAiBS,IAAI,CAAC,CAAC,EAAEH,YAAY,CAAC;QAEnE,IAAIF,MAAMM,KAAK,EAAEC,YAAYP,MAAMM,KAAK,EAAEE,YAAYR,MAAMM,KAAK,EAAEG,QAAQ;YACzE,OAAOT;QACT;QAEA,8EAA8E;QAC9E,wGAAwG;QACxG,yEAAyE;QACzE,IAAI;YAAC;YAAY;YAAQ;YAAY;SAAS,CAACU,QAAQ,CAACV,MAAMW,IAAI,GAAG;YACnEd,gBAAgB;gBACd,GAAGA,aAAa;gBAChB,CAACO,kBAAkB,EAAE;oBACnBO,MAAMX,MAAMW,IAAI;oBAChBC,OAAOZ,MAAMY,KAAK,IAAIZ,MAAMG,IAAI;gBAClC;YACF;QACF;QAEA,8FAA8F;QAC9F,IAAI;YAAC;YAAQ;YAAY;SAAS,CAACO,QAAQ,CAACV,MAAMW,IAAI,GAAG;YACvD,IAAIE,cAAc,CAAC;YACnB,IAAIb,MAAMM,KAAK,EAAEQ,YAAYC,SAASf,MAAMM,KAAK,EAAEQ,YAAYE,aAAa;gBAC1ElB,wBAAwB;YAC1B;YAEA,OAAO;gBACL,GAAGE,KAAK;gBACRM,OAAO;oBACL,GAAGN,MAAMM,KAAK;oBACdQ,YAAY;wBACV,GAAId,MAAMM,KAAK,EAAEQ,cAAc,CAAC,CAAC;wBACjCE,aAAa;wBACb,GAAGH,WAAW;oBAChB;gBACF;YACF;QACF;QAEA,IAAIb,MAAMiB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGjB,KAAK;gBACRiB,QAAQjB,MAAMiB,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBpB,YAAYoB,UAAUjB;YACpE;QACF;QAEA,IAAIF,MAAMoB,IAAI,EAAE;YACd,OAAO;gBACL,GAAGpB,KAAK;gBACRoB,MAAMpB,MAAMoB,IAAI,CAACF,GAAG,CAAC,CAACG;oBACpB,OAAO;wBACL,GAAGA,GAAG;wBACNJ,QAAQI,IAAIJ,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBpB,YAAYoB,UAAUE,IAAIlB,IAAI;oBAC1E;gBACF;YACF;QACF;QAEA,IAAIH,MAAMsB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGtB,KAAK;gBACRsB,QAAQtB,MAAMsB,MAAM,CAACJ,GAAG,CAAC,CAACK,QAAgB,CAAA;wBACxC,GAAGA,KAAK;wBACRN,QAAQM,MAAMN,MAAM,CAACC,GAAG,CAAC,CAACC,WACxBpB,YAAYoB,UAAU,CAAC,EAAEjB,YAAY,CAAC,EAAEqB,MAAMlB,IAAI,CAAC,CAAC;oBAExD,CAAA;YACF;QACF;QAEA,OAAOL;IACT;IAEA,MAAMwB,0BAA0B;QAC9B,GAAG5B,gBAAgB;QACnBqB,QAAQrB,iBAAiBqB,MAAM,CAACC,GAAG,CAAC,CAAClB,QAAUD,YAAYC;IAC7D;IAEA,IAAIF,uBAAuB;QACzB2B,QAAQC,IAAI,CACV,CAAC;;;mDAG4C,CAAC;IAElD;IAEA,OAAO;QACL7B;QACA2B;IACF;AACF,EAAC"}
1
+ {"version":3,"sources":["../../src/utilities/updateFieldsConfig.ts"],"sourcesContent":["import type { CollectionConfig } from 'payload'\n\ninterface UpdateFieldsConfig {\n schemaPathMap: Record<string, string>\n updatedCollectionConfig: CollectionConfig\n}\n\nexport const updateFieldsConfig = (collectionConfig: CollectionConfig): UpdateFieldsConfig => {\n let schemaPathMap = {}\n let customComponentsFound = false\n function updateField(field: any, parentPath = ''): any {\n const currentPath = parentPath ? `${parentPath}.${field.name}` : field.name\n const currentSchemaPath = `${collectionConfig.slug}.${currentPath}`\n\n if (field.admin?.disabled || field.admin?.readOnly || field.admin?.hidden) {\n return field\n }\n\n // Map field path for global fieldInstructionsMap to load related instructions\n // This is done due to save extra API call to get instructions when Field components are loaded in admin\n // Doing is will only call instructions data when user clicks on settings\n if (['richText', 'text', 'textarea', 'upload'].includes(field.type)) {\n schemaPathMap = {\n ...schemaPathMap,\n [currentSchemaPath]: {\n type: field.type,\n label: field.label || field.name,\n },\n }\n }\n\n // Inject AI actions, richText is not included here as it has to be explicitly defined by user\n if (['text', 'textarea', 'upload'].includes(field.type)) {\n let customField = {}\n\n // Custom fields don't fully adhere to the Payload schema, making it difficult to\n // determine which components support injecting ComposeField as a Description.\n if (field.admin?.components?.Field || field.admin?.components?.Description) {\n // TODO: Do something?\n }\n\n return {\n ...field,\n admin: {\n ...field.admin,\n components: {\n ...(field.admin?.components || {}),\n Description: '@ai-stack/payloadcms/fields#ComposeField',\n ...customField,\n },\n },\n }\n }\n\n if (field.fields) {\n return {\n ...field,\n fields: field.fields.map((subField: any) => updateField(subField, currentPath)),\n }\n }\n\n if (field.tabs) {\n return {\n ...field,\n tabs: field.tabs.map((tab: any) => {\n return {\n ...tab,\n fields: tab.fields.map((subField: any) => updateField(subField, tab.name)),\n }\n }),\n }\n }\n\n if (field.blocks) {\n return {\n ...field,\n blocks: field.blocks.map((block: any) => ({\n ...block,\n fields: block.fields.map((subField: any) =>\n updateField(subField, `${currentPath}.${block.slug}`),\n ),\n })),\n }\n }\n\n return field\n }\n\n const updatedCollectionConfig = {\n ...collectionConfig,\n fields: collectionConfig.fields.map((field) => updateField(field)),\n }\n\n return {\n schemaPathMap,\n updatedCollectionConfig,\n }\n}\n"],"names":["updateFieldsConfig","collectionConfig","schemaPathMap","customComponentsFound","updateField","field","parentPath","currentPath","name","currentSchemaPath","slug","admin","disabled","readOnly","hidden","includes","type","label","customField","components","Field","Description","fields","map","subField","tabs","tab","blocks","block","updatedCollectionConfig"],"mappings":"AAOA,OAAO,MAAMA,qBAAqB,CAACC;IACjC,IAAIC,gBAAgB,CAAC;IACrB,IAAIC,wBAAwB;IAC5B,SAASC,YAAYC,KAAU,EAAEC,aAAa,EAAE;QAC9C,MAAMC,cAAcD,aAAa,CAAC,EAAEA,WAAW,CAAC,EAAED,MAAMG,IAAI,CAAC,CAAC,GAAGH,MAAMG,IAAI;QAC3E,MAAMC,oBAAoB,CAAC,EAAER,iBAAiBS,IAAI,CAAC,CAAC,EAAEH,YAAY,CAAC;QAEnE,IAAIF,MAAMM,KAAK,EAAEC,YAAYP,MAAMM,KAAK,EAAEE,YAAYR,MAAMM,KAAK,EAAEG,QAAQ;YACzE,OAAOT;QACT;QAEA,8EAA8E;QAC9E,wGAAwG;QACxG,yEAAyE;QACzE,IAAI;YAAC;YAAY;YAAQ;YAAY;SAAS,CAACU,QAAQ,CAACV,MAAMW,IAAI,GAAG;YACnEd,gBAAgB;gBACd,GAAGA,aAAa;gBAChB,CAACO,kBAAkB,EAAE;oBACnBO,MAAMX,MAAMW,IAAI;oBAChBC,OAAOZ,MAAMY,KAAK,IAAIZ,MAAMG,IAAI;gBAClC;YACF;QACF;QAEA,8FAA8F;QAC9F,IAAI;YAAC;YAAQ;YAAY;SAAS,CAACO,QAAQ,CAACV,MAAMW,IAAI,GAAG;YACvD,IAAIE,cAAc,CAAC;YAEnB,iFAAiF;YACjF,8EAA8E;YAC9E,IAAIb,MAAMM,KAAK,EAAEQ,YAAYC,SAASf,MAAMM,KAAK,EAAEQ,YAAYE,aAAa;YAC1E,sBAAsB;YACxB;YAEA,OAAO;gBACL,GAAGhB,KAAK;gBACRM,OAAO;oBACL,GAAGN,MAAMM,KAAK;oBACdQ,YAAY;wBACV,GAAId,MAAMM,KAAK,EAAEQ,cAAc,CAAC,CAAC;wBACjCE,aAAa;wBACb,GAAGH,WAAW;oBAChB;gBACF;YACF;QACF;QAEA,IAAIb,MAAMiB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGjB,KAAK;gBACRiB,QAAQjB,MAAMiB,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBpB,YAAYoB,UAAUjB;YACpE;QACF;QAEA,IAAIF,MAAMoB,IAAI,EAAE;YACd,OAAO;gBACL,GAAGpB,KAAK;gBACRoB,MAAMpB,MAAMoB,IAAI,CAACF,GAAG,CAAC,CAACG;oBACpB,OAAO;wBACL,GAAGA,GAAG;wBACNJ,QAAQI,IAAIJ,MAAM,CAACC,GAAG,CAAC,CAACC,WAAkBpB,YAAYoB,UAAUE,IAAIlB,IAAI;oBAC1E;gBACF;YACF;QACF;QAEA,IAAIH,MAAMsB,MAAM,EAAE;YAChB,OAAO;gBACL,GAAGtB,KAAK;gBACRsB,QAAQtB,MAAMsB,MAAM,CAACJ,GAAG,CAAC,CAACK,QAAgB,CAAA;wBACxC,GAAGA,KAAK;wBACRN,QAAQM,MAAMN,MAAM,CAACC,GAAG,CAAC,CAACC,WACxBpB,YAAYoB,UAAU,CAAC,EAAEjB,YAAY,CAAC,EAAEqB,MAAMlB,IAAI,CAAC,CAAC;oBAExD,CAAA;YACF;QACF;QAEA,OAAOL;IACT;IAEA,MAAMwB,0BAA0B;QAC9B,GAAG5B,gBAAgB;QACnBqB,QAAQrB,iBAAiBqB,MAAM,CAACC,GAAG,CAAC,CAAClB,QAAUD,YAAYC;IAC7D;IAEA,OAAO;QACLH;QACA2B;IACF;AACF,EAAC"}