@wangeditor-next/editor-for-react 1.0.10 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -12,7 +12,7 @@
12
12
  1. 安装组件包
13
13
 
14
14
  ```shell
15
- yarn add @wangeditor-next/editor-for-react
15
+ pnpm add @wangeditor-next/editor-for-react
16
16
  # 或者npm install @wangeditor-next/editor-for-react --save
17
17
 
18
18
  ```
@@ -20,7 +20,7 @@ yarn add @wangeditor-next/editor-for-react
20
20
  2. 安装核心包
21
21
 
22
22
  ```shell
23
- yarn add @wangeditor-next/editor
23
+ pnpm add @wangeditor-next/editor
24
24
 
25
25
  # 或者 npm install @wangeditor-next/editor --save
26
26
  ```
@@ -2,7 +2,8 @@
2
2
  * @description editor react component
3
3
  * @author wangfupeng
4
4
  */
5
- import { IDomEditor, IEditorConfig, SlateDescendant } from '@wangeditor-next/editor';
5
+ import type { IDomEditor, IEditorConfig } from '@wangeditor-next/editor';
6
+ import { SlateDescendant } from '@wangeditor-next/editor';
6
7
  import React from 'react';
7
8
  interface IProps {
8
9
  defaultContent?: SlateDescendant[];
@@ -15,5 +16,5 @@ interface IProps {
15
16
  style?: React.CSSProperties;
16
17
  className?: string;
17
18
  }
18
- declare function EditorComponent(props: Partial<IProps>): any;
19
+ declare function EditorComponent(props: Partial<IProps>): React.JSX.Element;
19
20
  export default EditorComponent;
@@ -3,6 +3,7 @@
3
3
  * @author wangfupeng
4
4
  */
5
5
  import * as wangEditor from '@wangeditor-next/editor';
6
+ import React from 'react';
6
7
  interface IProps {
7
8
  editor: wangEditor.IDomEditor | null;
8
9
  defaultConfig?: Partial<wangEditor.IToolbarConfig>;
@@ -10,5 +11,5 @@ interface IProps {
10
11
  style?: object;
11
12
  className?: string;
12
13
  }
13
- declare function ToolbarComponent(props: IProps): any;
14
+ declare function ToolbarComponent(props: IProps): React.JSX.Element;
14
15
  export default ToolbarComponent;
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@wangeditor-next/editor"),require("react")):"function"==typeof define&&define.amd?define(["exports","@wangeditor-next/editor","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).WangEditorForReact={},e.wangEditor,e.React)}(this,function(e,t,r){"use strict";function n(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var o=n(t),a=function(){return a=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},a.apply(this,arguments)};function u(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,a=r.call(e),u=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)u.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=a.return)&&r.call(a)}finally{if(o)throw o.error}}return u}"function"==typeof SuppressedError&&SuppressedError,e.Editor=function(e){var n=e.defaultContent,o=void 0===n?[]:n,l=e.onCreated,i=e.defaultHtml,c=void 0===i?"":i,f=e.value,d=void 0===f?"":f,s=e.onChange,v=e.defaultConfig,y=void 0===v?{}:v,g=e.mode,p=void 0===g?"default":g,m=e.style,b=void 0===m?{}:m,h=e.className,E=r.useRef(null),C=u(r.useState(null),2),O=C[0],j=C[1],w=u(r.useState(""),2),_=w[0],x=w[1],S=function(e){l&&l(e);var t=y.onCreated;t&&t(e)},N=function(e){var t=y.onDestroyed;j(null),t&&t(e)};return r.useEffect(function(){null!=O&&(O.__react_on_change=function(e){x(e.getHtml()),s&&s(e);var t=y.onChange;t&&t(e)})},[O,y]),r.useEffect(function(){if(null!=O&&d!==_)try{O.setHtml(d)}catch(e){console.error(e)}},[d]),r.useEffect(function(){var e;if(null!=E.current&&null==O&&!(null===(e=E.current)||void 0===e?void 0:e.getAttribute("data-w-e-textarea"))){var r=t.createEditor({selector:E.current,config:a(a({},y),{onCreated:S,onChange:function(e){var t;return null===(t=null==r?void 0:r.__react_on_change)||void 0===t?void 0:t.call(r,e)},onDestroyed:N}),content:o,html:c||d,mode:p});j(r)}},[O]),r.createElement("div",{style:b,ref:E,className:h})},e.Toolbar=function(e){var t=e.editor,n=e.defaultConfig,a=void 0===n?{}:n,u=e.mode,l=void 0===u?"default":u,i=e.style,c=void 0===i?{}:i,f=e.className,d=r.useRef(null);return r.useEffect(function(){var e;if(null!=d.current&&null!=t&&!(null===(e=d.current)||void 0===e?void 0:e.getAttribute("data-w-e-toolbar"))){var r=o.createToolbar({editor:t,selector:d.current,config:a,mode:l});return function(){r&&r.destroy()}}},[t,a,l]),r.createElement("div",{style:c,ref:d,className:f})}});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@wangeditor-next/editor"),require("react")):"function"==typeof define&&define.amd?define(["exports","@wangeditor-next/editor","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).WangEditorForReact={},e.wangEditor,e.React)}(this,function(e,t,r){"use strict";function n(e){var t=Object.create(null);return e&&Object.keys(e).forEach(function(r){if("default"!==r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}}),t.default=e,Object.freeze(t)}var o=n(t),u=function(){return u=Object.assign||function(e){for(var t,r=1,n=arguments.length;r<n;r++)for(var o in t=arguments[r])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e},u.apply(this,arguments)};"function"==typeof SuppressedError&&SuppressedError,e.Editor=function(e){var n=e.defaultContent,o=void 0===n?[]:n,a=e.onCreated,l=e.defaultHtml,i=void 0===l?"":l,c=e.value,f=void 0===c?"":c,d=e.onChange,s=e.defaultConfig,v=void 0===s?{}:s,y=e.mode,g=void 0===y?"default":y,m=e.style,p=void 0===m?{}:m,b=e.className,h=r.useRef(null),E=r.useRef(""),_=r.useRef(!1),w=function(e,t){var r="function"==typeof Symbol&&e[Symbol.iterator];if(!r)return e;var n,o,u=r.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(n=u.next()).done;)a.push(n.value)}catch(e){o={error:e}}finally{try{n&&!n.done&&(r=u.return)&&r.call(u)}finally{if(o)throw o.error}}return a}(r.useState(null),2),C=w[0],O=w[1],j=function(e){a&&a(e);var t=v.onCreated;t&&t(e)},x=function(e){var t=v.onDestroyed;O(null),t&&t(e)};return r.useEffect(function(){if(null!=C)return C.__react_on_change=function(e){var t=e.getHtml(),r=E.current;if(E.current=t,!_.current&&t!==r){d&&d(e);var n=v.onChange;n&&n(e)}},function(){C.__react_on_change=void 0}},[C,v,d]),r.useEffect(function(){if(null!=C&&f!==E.current)try{_.current=!0,C.setHtml(f),E.current=C.getHtml()}catch(e){console.error(e)}finally{_.current=!1}},[C,f]),r.useEffect(function(){var e;if(null!=h.current&&null==C&&!(null===(e=h.current)||void 0===e?void 0:e.getAttribute("data-w-e-textarea"))){var r=t.createEditor({selector:h.current,config:u(u({},v),{onCreated:j,onChange:function(e){var t;return null===(t=null==r?void 0:r.__react_on_change)||void 0===t?void 0:t.call(r,e)},onDestroyed:x}),content:o,html:i||f,mode:g});E.current=r.getHtml(),O(r)}},[C]),r.createElement("div",{style:p,ref:h,className:b})},e.Toolbar=function(e){var t=e.editor,n=e.defaultConfig,u=void 0===n?{}:n,a=e.mode,l=void 0===a?"default":a,i=e.style,c=void 0===i?{}:i,f=e.className,d=r.useRef(null);return r.useEffect(function(){var e;if(null!=d.current&&null!=t&&!(null===(e=d.current)||void 0===e?void 0:e.getAttribute("data-w-e-toolbar"))){var r=o.createToolbar({editor:t,selector:d.current,config:u,mode:l});return function(){var e;r&&(r.destroy(),null===(e=d.current)||void 0===e||e.removeAttribute("data-w-e-toolbar"))}}},[t,u,l]),r.createElement("div",{style:c,ref:d,className:f})}});
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/components/Editor.tsx","../src/components/Toolbar.tsx"],"sourcesContent":["/**\n * @description editor react component\n * @author wangfupeng\n */\n\nimport {\n createEditor, IDomEditor, IEditorConfig, SlateDescendant,\n} from '@wangeditor-next/editor'\nimport React, { useEffect, useRef, useState } from 'react'\n\ninterface IProps {\n defaultContent?: SlateDescendant[]\n onCreated?: (editor: IDomEditor) => void\n defaultHtml?: string\n value?: string\n onChange: (editor: IDomEditor) => void\n defaultConfig: Partial<IEditorConfig>\n mode?: string\n style?: React.CSSProperties\n className?: string\n}\n\ninterface ICustomDomEditor extends IDomEditor {\n __react_on_change?: (editor: ICustomDomEditor) => void;\n}\n\nfunction EditorComponent(props: Partial<IProps>) {\n const {\n defaultContent = [], onCreated, defaultHtml = '', value = '', onChange, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n const [editor, setEditor] = useState<ICustomDomEditor | null>(null)\n const [curValue, setCurValue] = useState('')\n\n const handleCreated = (createdEditor: IDomEditor) => {\n // 组件属性 onCreated\n if (onCreated) { onCreated(createdEditor) }\n\n // 编辑器 配置 onCreated\n const { onCreated: onCreatedFromConfig } = defaultConfig\n\n if (onCreatedFromConfig) { onCreatedFromConfig(createdEditor) }\n }\n\n const handleDestroyed = (destroyedEditor: IDomEditor) => {\n const { onDestroyed } = defaultConfig\n\n setEditor(null)\n if (onDestroyed) {\n onDestroyed(destroyedEditor)\n }\n }\n\n useEffect(() => {\n if (editor == null) { return }\n\n // eslint-disable-next-line no-underscore-dangle\n editor.__react_on_change = (e: IDomEditor) => {\n setCurValue(e.getHtml()) // 记录当前 html 值\n\n // 组件属性 onChange\n if (onChange) { onChange(e) }\n\n // 编辑器 配置 onChange\n const { onChange: onChangeFromConfig } = defaultConfig\n\n if (onChangeFromConfig) { onChangeFromConfig(e) }\n }\n }, [editor, defaultConfig])\n\n // value 变化,重置 HTML\n useEffect(() => {\n if (editor == null) { return }\n\n if (value === curValue) { return } // 如果和当前 html 值相等,则忽略\n\n // ------ 重新设置 HTML ------\n try {\n editor.setHtml(value)\n } catch (error) {\n console.error(error)\n }\n\n }, [value])\n\n useEffect(() => {\n if (ref.current == null) { return }\n if (editor != null) { return }\n // 防止重复渲染 当编辑器已经创建就不在创建了\n if (ref.current?.getAttribute('data-w-e-textarea')) { return }\n\n const newEditor = createEditor({\n selector: ref.current,\n config: {\n ...defaultConfig,\n onCreated: handleCreated,\n // eslint-disable-next-line no-underscore-dangle\n onChange: (e: IDomEditor) => newEditor?.__react_on_change?.(e),\n onDestroyed: handleDestroyed,\n },\n content: defaultContent,\n html: defaultHtml || value,\n mode,\n })as ICustomDomEditor\n\n setEditor(newEditor)\n }, [editor])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default EditorComponent\n","/**\n * @description toolbar react component\n * @author wangfupeng\n */\n\nimport * as wangEditor from '@wangeditor-next/editor'\nimport React, { useEffect, useRef } from 'react'\n\ninterface IProps {\n editor: wangEditor.IDomEditor | null\n defaultConfig?: Partial<wangEditor.IToolbarConfig>\n mode?: string\n style?: object\n className?: string\n}\n\nfunction ToolbarComponent(props: IProps) {\n const {\n editor, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (ref.current == null) { return }\n if (editor == null) { return }\n if (ref.current?.getAttribute('data-w-e-toolbar')) { return }\n\n const toolbar = wangEditor.createToolbar({\n editor,\n selector: ref.current,\n config: defaultConfig,\n mode,\n })\n\n return () => {\n if (toolbar) {\n toolbar.destroy()\n }\n }\n }, [editor, defaultConfig, mode])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default ToolbarComponent\n"],"names":["props","_a","defaultContent","onCreated","_b","defaultHtml","_c","value","onChange","_d","defaultConfig","_e","mode","_f","style","className","ref","useRef","_g","__read","useState","editor","setEditor","_h","curValue","setCurValue","handleCreated","createdEditor","onCreatedFromConfig","handleDestroyed","destroyedEditor","onDestroyed","useEffect","__react_on_change","e","getHtml","onChangeFromConfig","setHtml","error","console","current","getAttribute","newEditor","createEditor","selector","config","__assign","call","content","html","React","createElement","toolbar","wangEditor","createToolbar","destroy"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/components/Editor.tsx","../src/components/Toolbar.tsx"],"sourcesContent":["/**\n * @description editor react component\n * @author wangfupeng\n */\n\nimport type { IDomEditor, IEditorConfig } from '@wangeditor-next/editor'\nimport {\n createEditor, SlateDescendant,\n} from '@wangeditor-next/editor'\nimport React, { useEffect, useRef, useState } from 'react'\n\ninterface IProps {\n defaultContent?: SlateDescendant[]\n onCreated?: (editor: IDomEditor) => void\n defaultHtml?: string\n value?: string\n onChange: (editor: IDomEditor) => void\n defaultConfig: Partial<IEditorConfig>\n mode?: string\n style?: React.CSSProperties\n className?: string\n}\n\ninterface ICustomDomEditor extends IDomEditor {\n __react_on_change?: (editor: ICustomDomEditor) => void;\n}\n\nfunction EditorComponent(props: Partial<IProps>) {\n const {\n defaultContent = [], onCreated, defaultHtml = '', value = '', onChange, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n const latestHtmlRef = useRef('')\n const isSyncingFromPropsRef = useRef(false)\n const [editor, setEditor] = useState<ICustomDomEditor | null>(null)\n\n const handleCreated = (createdEditor: IDomEditor) => {\n // 组件属性 onCreated\n if (onCreated) { onCreated(createdEditor) }\n\n // 编辑器 配置 onCreated\n const { onCreated: onCreatedFromConfig } = defaultConfig\n\n if (onCreatedFromConfig) { onCreatedFromConfig(createdEditor) }\n }\n\n const handleDestroyed = (destroyedEditor: IDomEditor) => {\n const { onDestroyed } = defaultConfig\n\n setEditor(null)\n if (onDestroyed) {\n onDestroyed(destroyedEditor)\n }\n }\n\n useEffect(() => {\n if (editor == null) { return }\n\n // eslint-disable-next-line no-underscore-dangle\n editor.__react_on_change = (e: IDomEditor) => {\n const latestHtml = e.getHtml()\n const prevHtml = latestHtmlRef.current\n\n latestHtmlRef.current = latestHtml // 记录当前 html 值\n\n // 由 props 同步触发 setHtml 时,不向外触发 onChange,避免受控场景产生回环\n if (isSyncingFromPropsRef.current) { return }\n\n // 仅在内容发生变化时触发,对齐输入控件 onChange 语义(忽略选区/焦点变化)\n if (latestHtml === prevHtml) { return }\n\n // 组件属性 onChange\n if (onChange) { onChange(e) }\n\n // 编辑器 配置 onChange\n const { onChange: onChangeFromConfig } = defaultConfig\n\n if (onChangeFromConfig) { onChangeFromConfig(e) }\n }\n return () => {\n // eslint-disable-next-line no-underscore-dangle\n editor.__react_on_change = undefined\n }\n }, [editor, defaultConfig, onChange])\n\n // value 变化,重置 HTML\n useEffect(() => {\n if (editor == null) { return }\n\n if (value === latestHtmlRef.current) { return } // 如果和当前 html 值相等,则忽略\n\n // ------ 重新设置 HTML ------\n try {\n isSyncingFromPropsRef.current = true\n editor.setHtml(value)\n latestHtmlRef.current = editor.getHtml()\n } catch (error) {\n console.error(error)\n } finally {\n isSyncingFromPropsRef.current = false\n }\n }, [editor, value])\n\n useEffect(() => {\n if (ref.current == null) { return }\n if (editor != null) { return }\n // 防止重复渲染 当编辑器已经创建就不在创建了\n if (ref.current?.getAttribute('data-w-e-textarea')) { return }\n\n const newEditor = createEditor({\n selector: ref.current,\n config: {\n ...defaultConfig,\n onCreated: handleCreated,\n // eslint-disable-next-line no-underscore-dangle\n onChange: (e: IDomEditor) => newEditor?.__react_on_change?.(e),\n onDestroyed: handleDestroyed,\n },\n content: defaultContent,\n html: defaultHtml || value,\n mode,\n })as ICustomDomEditor\n\n latestHtmlRef.current = newEditor.getHtml()\n setEditor(newEditor)\n }, [editor])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default EditorComponent\n","/**\n * @description toolbar react component\n * @author wangfupeng\n */\n\nimport * as wangEditor from '@wangeditor-next/editor'\nimport React, { useEffect, useRef } from 'react'\n\ninterface IProps {\n editor: wangEditor.IDomEditor | null\n defaultConfig?: Partial<wangEditor.IToolbarConfig>\n mode?: string\n style?: object\n className?: string\n}\n\nfunction ToolbarComponent(props: IProps) {\n const {\n editor, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (ref.current == null || editor == null) { return }\n if (ref.current?.getAttribute('data-w-e-toolbar')) { return }\n\n const toolbar = wangEditor.createToolbar({\n editor,\n selector: ref.current,\n config: defaultConfig,\n mode,\n })\n\n return () => {\n if (toolbar) {\n toolbar.destroy()\n ref.current?.removeAttribute('data-w-e-toolbar')\n }\n }\n }, [editor, defaultConfig, mode])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default ToolbarComponent\n"],"names":["props","_a","defaultContent","onCreated","_b","defaultHtml","_c","value","onChange","_d","defaultConfig","_e","mode","_f","style","className","ref","useRef","latestHtmlRef","isSyncingFromPropsRef","_g","__read","useState","editor","setEditor","handleCreated","createdEditor","onCreatedFromConfig","handleDestroyed","destroyedEditor","onDestroyed","useEffect","__react_on_change","e","latestHtml","getHtml","prevHtml","current","onChangeFromConfig","undefined","setHtml","error","console","getAttribute","newEditor","createEditor","selector","config","__assign","call","content","html","React","createElement","toolbar","wangEditor","createToolbar","destroy","removeAttribute"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,2 +1,2 @@
1
- import*as t from"@wangeditor-next/editor";import{createEditor as e}from"@wangeditor-next/editor";import r,{useRef as n,useState as o,useEffect as l}from"react";var a=function(){return a=Object.assign||function(t){for(var e,r=1,n=arguments.length;r<n;r++)for(var o in e=arguments[r])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t},a.apply(this,arguments)};function i(t,e){var r="function"==typeof Symbol&&t[Symbol.iterator];if(!r)return t;var n,o,l=r.call(t),a=[];try{for(;(void 0===e||e-- >0)&&!(n=l.next()).done;)a.push(n.value)}catch(t){o={error:t}}finally{try{n&&!n.done&&(r=l.return)&&r.call(l)}finally{if(o)throw o.error}}return a}function u(t){var u=t.defaultContent,c=void 0===u?[]:u,d=t.onCreated,f=t.defaultHtml,v=void 0===f?"":f,s=t.value,m=void 0===s?"":s,y=t.onChange,g=t.defaultConfig,p=void 0===g?{}:g,h=t.mode,b=void 0===h?"default":h,C=t.style,_=void 0===C?{}:C,w=t.className,x=n(null),E=i(o(null),2),N=E[0],S=E[1],H=i(o(""),2),O=H[0],j=H[1],A=function(t){d&&d(t);var e=p.onCreated;e&&e(t)},D=function(t){var e=p.onDestroyed;S(null),e&&e(t)};return l(function(){null!=N&&(N.__react_on_change=function(t){j(t.getHtml()),y&&y(t);var e=p.onChange;e&&e(t)})},[N,p]),l(function(){if(null!=N&&m!==O)try{N.setHtml(m)}catch(t){console.error(t)}},[m]),l(function(){var t;if(null!=x.current&&null==N&&!(null===(t=x.current)||void 0===t?void 0:t.getAttribute("data-w-e-textarea"))){var r=e({selector:x.current,config:a(a({},p),{onCreated:A,onChange:function(t){var e;return null===(e=null==r?void 0:r.__react_on_change)||void 0===e?void 0:e.call(r,t)},onDestroyed:D}),content:c,html:v||m,mode:b});S(r)}},[N]),r.createElement("div",{style:_,ref:x,className:w})}function c(e){var o=e.editor,a=e.defaultConfig,i=void 0===a?{}:a,u=e.mode,c=void 0===u?"default":u,d=e.style,f=void 0===d?{}:d,v=e.className,s=n(null);return l(function(){var e;if(null!=s.current&&null!=o&&!(null===(e=s.current)||void 0===e?void 0:e.getAttribute("data-w-e-toolbar"))){var r=t.createToolbar({editor:o,selector:s.current,config:i,mode:c});return function(){r&&r.destroy()}}},[o,i,c]),r.createElement("div",{style:f,ref:s,className:v})}"function"==typeof SuppressedError&&SuppressedError;export{u as Editor,c as Toolbar};
1
+ import*as r from"@wangeditor-next/editor";import{createEditor as t}from"@wangeditor-next/editor";import e,{useRef as n,useState as o,useEffect as a}from"react";var l=function(){return l=Object.assign||function(r){for(var t,e=1,n=arguments.length;e<n;e++)for(var o in t=arguments[e])Object.prototype.hasOwnProperty.call(t,o)&&(r[o]=t[o]);return r},l.apply(this,arguments)};function u(r){var u=r.defaultContent,i=void 0===u?[]:u,c=r.onCreated,d=r.defaultHtml,f=void 0===d?"":d,v=r.value,s=void 0===v?"":v,m=r.onChange,y=r.defaultConfig,g=void 0===y?{}:y,p=r.mode,h=void 0===p?"default":p,_=r.style,b=void 0===_?{}:_,C=r.className,w=n(null),x=n(""),E=n(!1),H=function(r,t){var e="function"==typeof Symbol&&r[Symbol.iterator];if(!e)return r;var n,o,a=e.call(r),l=[];try{for(;(void 0===t||t-- >0)&&!(n=a.next()).done;)l.push(n.value)}catch(r){o={error:r}}finally{try{n&&!n.done&&(e=a.return)&&e.call(a)}finally{if(o)throw o.error}}return l}(o(null),2),N=H[0],S=H[1],A=function(r){c&&c(r);var t=g.onCreated;t&&t(r)},O=function(r){var t=g.onDestroyed;S(null),t&&t(r)};return a(function(){if(null!=N)return N.__react_on_change=function(r){var t=r.getHtml(),e=x.current;if(x.current=t,!E.current&&t!==e){m&&m(r);var n=g.onChange;n&&n(r)}},function(){N.__react_on_change=void 0}},[N,g,m]),a(function(){if(null!=N&&s!==x.current)try{E.current=!0,N.setHtml(s),x.current=N.getHtml()}catch(r){console.error(r)}finally{E.current=!1}},[N,s]),a(function(){var r;if(null!=w.current&&null==N&&!(null===(r=w.current)||void 0===r?void 0:r.getAttribute("data-w-e-textarea"))){var e=t({selector:w.current,config:l(l({},g),{onCreated:A,onChange:function(r){var t;return null===(t=null==e?void 0:e.__react_on_change)||void 0===t?void 0:t.call(e,r)},onDestroyed:O}),content:i,html:f||s,mode:h});x.current=e.getHtml(),S(e)}},[N]),e.createElement("div",{style:b,ref:w,className:C})}function i(t){var o=t.editor,l=t.defaultConfig,u=void 0===l?{}:l,i=t.mode,c=void 0===i?"default":i,d=t.style,f=void 0===d?{}:d,v=t.className,s=n(null);return a(function(){var t;if(null!=s.current&&null!=o&&!(null===(t=s.current)||void 0===t?void 0:t.getAttribute("data-w-e-toolbar"))){var e=r.createToolbar({editor:o,selector:s.current,config:u,mode:c});return function(){var r;e&&(e.destroy(),null===(r=s.current)||void 0===r||r.removeAttribute("data-w-e-toolbar"))}}},[o,u,c]),e.createElement("div",{style:f,ref:s,className:v})}"function"==typeof SuppressedError&&SuppressedError;export{u as Editor,i as Toolbar};
2
2
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../src/components/Editor.tsx","../src/components/Toolbar.tsx"],"sourcesContent":["/**\n * @description editor react component\n * @author wangfupeng\n */\n\nimport {\n createEditor, IDomEditor, IEditorConfig, SlateDescendant,\n} from '@wangeditor-next/editor'\nimport React, { useEffect, useRef, useState } from 'react'\n\ninterface IProps {\n defaultContent?: SlateDescendant[]\n onCreated?: (editor: IDomEditor) => void\n defaultHtml?: string\n value?: string\n onChange: (editor: IDomEditor) => void\n defaultConfig: Partial<IEditorConfig>\n mode?: string\n style?: React.CSSProperties\n className?: string\n}\n\ninterface ICustomDomEditor extends IDomEditor {\n __react_on_change?: (editor: ICustomDomEditor) => void;\n}\n\nfunction EditorComponent(props: Partial<IProps>) {\n const {\n defaultContent = [], onCreated, defaultHtml = '', value = '', onChange, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n const [editor, setEditor] = useState<ICustomDomEditor | null>(null)\n const [curValue, setCurValue] = useState('')\n\n const handleCreated = (createdEditor: IDomEditor) => {\n // 组件属性 onCreated\n if (onCreated) { onCreated(createdEditor) }\n\n // 编辑器 配置 onCreated\n const { onCreated: onCreatedFromConfig } = defaultConfig\n\n if (onCreatedFromConfig) { onCreatedFromConfig(createdEditor) }\n }\n\n const handleDestroyed = (destroyedEditor: IDomEditor) => {\n const { onDestroyed } = defaultConfig\n\n setEditor(null)\n if (onDestroyed) {\n onDestroyed(destroyedEditor)\n }\n }\n\n useEffect(() => {\n if (editor == null) { return }\n\n // eslint-disable-next-line no-underscore-dangle\n editor.__react_on_change = (e: IDomEditor) => {\n setCurValue(e.getHtml()) // 记录当前 html 值\n\n // 组件属性 onChange\n if (onChange) { onChange(e) }\n\n // 编辑器 配置 onChange\n const { onChange: onChangeFromConfig } = defaultConfig\n\n if (onChangeFromConfig) { onChangeFromConfig(e) }\n }\n }, [editor, defaultConfig])\n\n // value 变化,重置 HTML\n useEffect(() => {\n if (editor == null) { return }\n\n if (value === curValue) { return } // 如果和当前 html 值相等,则忽略\n\n // ------ 重新设置 HTML ------\n try {\n editor.setHtml(value)\n } catch (error) {\n console.error(error)\n }\n\n }, [value])\n\n useEffect(() => {\n if (ref.current == null) { return }\n if (editor != null) { return }\n // 防止重复渲染 当编辑器已经创建就不在创建了\n if (ref.current?.getAttribute('data-w-e-textarea')) { return }\n\n const newEditor = createEditor({\n selector: ref.current,\n config: {\n ...defaultConfig,\n onCreated: handleCreated,\n // eslint-disable-next-line no-underscore-dangle\n onChange: (e: IDomEditor) => newEditor?.__react_on_change?.(e),\n onDestroyed: handleDestroyed,\n },\n content: defaultContent,\n html: defaultHtml || value,\n mode,\n })as ICustomDomEditor\n\n setEditor(newEditor)\n }, [editor])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default EditorComponent\n","/**\n * @description toolbar react component\n * @author wangfupeng\n */\n\nimport * as wangEditor from '@wangeditor-next/editor'\nimport React, { useEffect, useRef } from 'react'\n\ninterface IProps {\n editor: wangEditor.IDomEditor | null\n defaultConfig?: Partial<wangEditor.IToolbarConfig>\n mode?: string\n style?: object\n className?: string\n}\n\nfunction ToolbarComponent(props: IProps) {\n const {\n editor, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (ref.current == null) { return }\n if (editor == null) { return }\n if (ref.current?.getAttribute('data-w-e-toolbar')) { return }\n\n const toolbar = wangEditor.createToolbar({\n editor,\n selector: ref.current,\n config: defaultConfig,\n mode,\n })\n\n return () => {\n if (toolbar) {\n toolbar.destroy()\n }\n }\n }, [editor, defaultConfig, mode])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default ToolbarComponent\n"],"names":["EditorComponent","props","_a","defaultContent","onCreated","_b","defaultHtml","_c","value","onChange","_d","defaultConfig","_e","mode","_f","style","className","ref","useRef","_g","__read","useState","editor","setEditor","_h","curValue","setCurValue","handleCreated","createdEditor","onCreatedFromConfig","handleDestroyed","destroyedEditor","onDestroyed","useEffect","__react_on_change","e","getHtml","onChangeFromConfig","setHtml","error","console","current","getAttribute","newEditor","createEditor","selector","config","__assign","call","content","html","React","createElement","ToolbarComponent","toolbar","wangEditor","createToolbar","destroy"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","sources":["../src/components/Editor.tsx","../src/components/Toolbar.tsx"],"sourcesContent":["/**\n * @description editor react component\n * @author wangfupeng\n */\n\nimport type { IDomEditor, IEditorConfig } from '@wangeditor-next/editor'\nimport {\n createEditor, SlateDescendant,\n} from '@wangeditor-next/editor'\nimport React, { useEffect, useRef, useState } from 'react'\n\ninterface IProps {\n defaultContent?: SlateDescendant[]\n onCreated?: (editor: IDomEditor) => void\n defaultHtml?: string\n value?: string\n onChange: (editor: IDomEditor) => void\n defaultConfig: Partial<IEditorConfig>\n mode?: string\n style?: React.CSSProperties\n className?: string\n}\n\ninterface ICustomDomEditor extends IDomEditor {\n __react_on_change?: (editor: ICustomDomEditor) => void;\n}\n\nfunction EditorComponent(props: Partial<IProps>) {\n const {\n defaultContent = [], onCreated, defaultHtml = '', value = '', onChange, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n const latestHtmlRef = useRef('')\n const isSyncingFromPropsRef = useRef(false)\n const [editor, setEditor] = useState<ICustomDomEditor | null>(null)\n\n const handleCreated = (createdEditor: IDomEditor) => {\n // 组件属性 onCreated\n if (onCreated) { onCreated(createdEditor) }\n\n // 编辑器 配置 onCreated\n const { onCreated: onCreatedFromConfig } = defaultConfig\n\n if (onCreatedFromConfig) { onCreatedFromConfig(createdEditor) }\n }\n\n const handleDestroyed = (destroyedEditor: IDomEditor) => {\n const { onDestroyed } = defaultConfig\n\n setEditor(null)\n if (onDestroyed) {\n onDestroyed(destroyedEditor)\n }\n }\n\n useEffect(() => {\n if (editor == null) { return }\n\n // eslint-disable-next-line no-underscore-dangle\n editor.__react_on_change = (e: IDomEditor) => {\n const latestHtml = e.getHtml()\n const prevHtml = latestHtmlRef.current\n\n latestHtmlRef.current = latestHtml // 记录当前 html 值\n\n // 由 props 同步触发 setHtml 时,不向外触发 onChange,避免受控场景产生回环\n if (isSyncingFromPropsRef.current) { return }\n\n // 仅在内容发生变化时触发,对齐输入控件 onChange 语义(忽略选区/焦点变化)\n if (latestHtml === prevHtml) { return }\n\n // 组件属性 onChange\n if (onChange) { onChange(e) }\n\n // 编辑器 配置 onChange\n const { onChange: onChangeFromConfig } = defaultConfig\n\n if (onChangeFromConfig) { onChangeFromConfig(e) }\n }\n return () => {\n // eslint-disable-next-line no-underscore-dangle\n editor.__react_on_change = undefined\n }\n }, [editor, defaultConfig, onChange])\n\n // value 变化,重置 HTML\n useEffect(() => {\n if (editor == null) { return }\n\n if (value === latestHtmlRef.current) { return } // 如果和当前 html 值相等,则忽略\n\n // ------ 重新设置 HTML ------\n try {\n isSyncingFromPropsRef.current = true\n editor.setHtml(value)\n latestHtmlRef.current = editor.getHtml()\n } catch (error) {\n console.error(error)\n } finally {\n isSyncingFromPropsRef.current = false\n }\n }, [editor, value])\n\n useEffect(() => {\n if (ref.current == null) { return }\n if (editor != null) { return }\n // 防止重复渲染 当编辑器已经创建就不在创建了\n if (ref.current?.getAttribute('data-w-e-textarea')) { return }\n\n const newEditor = createEditor({\n selector: ref.current,\n config: {\n ...defaultConfig,\n onCreated: handleCreated,\n // eslint-disable-next-line no-underscore-dangle\n onChange: (e: IDomEditor) => newEditor?.__react_on_change?.(e),\n onDestroyed: handleDestroyed,\n },\n content: defaultContent,\n html: defaultHtml || value,\n mode,\n })as ICustomDomEditor\n\n latestHtmlRef.current = newEditor.getHtml()\n setEditor(newEditor)\n }, [editor])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default EditorComponent\n","/**\n * @description toolbar react component\n * @author wangfupeng\n */\n\nimport * as wangEditor from '@wangeditor-next/editor'\nimport React, { useEffect, useRef } from 'react'\n\ninterface IProps {\n editor: wangEditor.IDomEditor | null\n defaultConfig?: Partial<wangEditor.IToolbarConfig>\n mode?: string\n style?: object\n className?: string\n}\n\nfunction ToolbarComponent(props: IProps) {\n const {\n editor, defaultConfig = {}, mode = 'default', style = {}, className,\n } = props\n const ref = useRef<HTMLDivElement>(null)\n\n useEffect(() => {\n if (ref.current == null || editor == null) { return }\n if (ref.current?.getAttribute('data-w-e-toolbar')) { return }\n\n const toolbar = wangEditor.createToolbar({\n editor,\n selector: ref.current,\n config: defaultConfig,\n mode,\n })\n\n return () => {\n if (toolbar) {\n toolbar.destroy()\n ref.current?.removeAttribute('data-w-e-toolbar')\n }\n }\n }, [editor, defaultConfig, mode])\n\n return <div style={style} ref={ref} className={className}></div>\n}\n\nexport default ToolbarComponent\n"],"names":["EditorComponent","props","_a","defaultContent","onCreated","_b","defaultHtml","_c","value","onChange","_d","defaultConfig","_e","mode","_f","style","className","ref","useRef","latestHtmlRef","isSyncingFromPropsRef","_g","__read","useState","editor","setEditor","handleCreated","createdEditor","onCreatedFromConfig","handleDestroyed","destroyedEditor","onDestroyed","useEffect","__react_on_change","e","latestHtml","getHtml","prevHtml","current","onChangeFromConfig","undefined","setHtml","error","console","getAttribute","newEditor","createEditor","selector","config","__assign","call","content","html","React","createElement","ToolbarComponent","toolbar","wangEditor","createToolbar","destroy","removeAttribute"],"mappings":"oXA2BA,SAASA,EAAgBC,GAErB,IAAAC,EACED,EAAKE,eADPA,OAAc,IAAAD,EAAG,GAAEA,EAAEE,EACnBH,EAAKG,UADyBC,EAC9BJ,EAAKK,YADyBA,OAAW,IAAAD,EAAG,GAAEA,EAAEE,EAChDN,EAAKO,MAD2CA,OAAK,IAAAD,EAAG,GAAEA,EAAEE,EAC5DR,EAAKQ,SADiEC,EACtET,EAAKU,cADiEA,OAAa,IAAAD,EAAG,CAAA,EAAEA,EAAEE,EAC1FX,EAAKY,KADqFA,OAAI,IAAAD,EAAG,UAASA,EAAEE,EAC5Gb,EAAKc,MADuGA,OAAK,IAAAD,EAAG,CAAA,EAAEA,EAAEE,EACxHf,YACEgB,EAAMC,EAAuB,MAC7BC,EAAgBD,EAAO,IACvBE,EAAwBF,GAAO,GAC/BG,yRAAAC,CAAsBC,EAAkC,MAAK,GAA5DC,EAAMH,EAAA,GAAEI,OAETC,EAAgB,SAACC,GAEjBvB,GAAaA,EAAUuB,GAGnB,IAAWC,EAAwBjB,EAAaP,UAEpDwB,GAAuBA,EAAoBD,EACjD,EAEME,EAAkB,SAACC,GACf,IAAAC,EAAgBpB,EAAaoB,YAErCN,EAAU,MACNM,GACFA,EAAYD,EAEhB,EA0EA,OAxEAE,EAAU,WACR,GAAc,MAAVR,EAuBJ,OApBAA,EAAOS,kBAAoB,SAACC,GAC1B,IAAMC,EAAaD,EAAEE,UACfC,EAAWlB,EAAcmB,QAK/B,GAHAnB,EAAcmB,QAAUH,GAGpBf,EAAsBkB,SAGtBH,IAAeE,EAAnB,CAGI5B,GAAYA,EAASyB,GAGjB,IAAUK,EAAuB5B,EAAaF,SAElD8B,GAAsBA,EAAmBL,EARP,CASxC,EACO,WAELV,EAAOS,uBAAoBO,CAC7B,CACF,EAAG,CAAChB,EAAQb,EAAeF,IAG3BuB,EAAU,WACR,GAAc,MAAVR,GAEAhB,IAAUW,EAAcmB,QAG5B,IACElB,EAAsBkB,SAAU,EAChCd,EAAOiB,QAAQjC,GACfW,EAAcmB,QAAUd,EAAOY,SACjC,CAAE,MAAOM,GACPC,QAAQD,MAAMA,EAChB,CAAC,QACCtB,EAAsBkB,SAAU,CAClC,CACF,EAAG,CAACd,EAAQhB,IAEZwB,EAAU,iBACR,GAAmB,MAAff,EAAIqB,SACM,MAAVd,KAEW,QAAXtB,EAAAe,EAAIqB,eAAO,IAAApC,OAAA,EAAAA,EAAE0C,aAAa,sBAA9B,CAEA,IAAMC,EAAYC,EAAa,CAC7BC,SAAU9B,EAAIqB,QACdU,OAAMC,EAAAA,EAAA,CAAA,EACDtC,GAAa,CAChBP,UAAWsB,EAEXjB,SAAU,SAACyB,GAAa,IAAAhC,EAAK,OAA4B,QAA5BA,EAAA2C,aAAS,EAATA,EAAWZ,yBAAiB,IAAA/B,OAAA,EAAAA,EAAAgD,KAAAL,EAAGX,IAC5DH,YAAaF,IAEfsB,QAAShD,EACTiD,KAAM9C,GAAeE,EACrBK,KAAIA,IAGNM,EAAcmB,QAAUO,EAAUT,UAClCX,EAAUoB,EAjBmD,CAkB/D,EAAG,CAACrB,IAEG6B,EAAAC,cAAA,MAAA,CAAKvC,MAAOA,EAAOE,IAAKA,EAAKD,UAAWA,GACjD,CChHA,SAASuC,EAAiBtD,GAEtB,IAAAuB,EACEvB,EAAKuB,OADCtB,EACND,EAAKU,cADCA,aAAgB,CAAA,EAAET,EAAEG,EAC1BJ,EAAKY,KADqBA,OAAI,IAAAR,EAAG,UAASA,EAAEE,EAC5CN,QAD4Cc,OAAK,IAAAR,EAAG,CAAA,IAAIS,EACxDf,YACEgB,EAAMC,EAAuB,MAqBnC,OAnBAc,EAAU,iBACR,GAAmB,MAAff,EAAIqB,SAA6B,MAAVd,KACZ,QAAXtB,EAAAe,EAAIqB,eAAO,IAAApC,OAAA,EAAAA,EAAE0C,aAAa,qBAA9B,CAEA,IAAMY,EAAUC,EAAWC,cAAc,CACvClC,OAAMA,EACNuB,SAAU9B,EAAIqB,QACdU,OAAQrC,EACRE,KAAIA,IAGN,OAAO,iBACD2C,IACFA,EAAQG,UACG,QAAXzD,EAAAe,EAAIqB,eAAO,IAAApC,GAAAA,EAAE0D,gBAAgB,oBAEjC,CAd4D,CAe9D,EAAG,CAACpC,EAAQb,EAAeE,IAEpBwC,EAAAC,cAAA,MAAA,CAAKvC,MAAOA,EAAOE,IAAKA,EAAKD,UAAWA,GACjD"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wangeditor-next/editor-for-react",
3
- "version": "1.0.10",
3
+ "version": "2.0.0",
4
4
  "description": "wangEditor next editor for react",
5
5
  "author": "cycleccc <2991205548@qq.com>",
6
6
  "type": "module",
@@ -34,13 +34,13 @@
34
34
  "url": "https://github.com/wangeditor-next/wangEditor-next/issues"
35
35
  },
36
36
  "devDependencies": {
37
- "@wangeditor-next/editor": "^5.6.40",
37
+ "@wangeditor-next/editor": "^5.7.0",
38
38
  "react": "^17.0.2",
39
39
  "react-dom": "^17.0.2",
40
- "@wangeditor-next-shared/rollup-config": "^0.0.1"
40
+ "@wangeditor-next-shared/rollup-config": "^0.0.2"
41
41
  },
42
42
  "peerDependencies": {
43
- "@wangeditor-next/editor": ">=5.6.40",
43
+ "@wangeditor-next/editor": ">=5.7.0",
44
44
  "react": ">=17.0.2",
45
45
  "react-dom": ">=17.0.2"
46
46
  },