@arkyn/components 1.3.120 → 1.3.122

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.
@@ -0,0 +1,3 @@
1
+ declare const getSlateFromHtml: (html: string) => (import("../defineType").CustomElement | import("../defineType").CustomText)[];
2
+ export { getSlateFromHtml };
3
+ //# sourceMappingURL=deserialize.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deserialize.d.ts","sourceRoot":"","sources":["../../../../src/components/RichText/functions/deserialize.ts"],"names":[],"mappings":"AAiDA,QAAA,MAAM,gBAAgB,SAAU,MAAM,mFAarC,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -0,0 +1,55 @@
1
+ import parse from "html-react-parser";
2
+ const deserialize = (el) => {
3
+ if (typeof el === "string")
4
+ return { text: el || "" };
5
+ function parsedChildren(children) {
6
+ return children.map((child) => deserialize(child));
7
+ }
8
+ const children = Array.isArray(el.props.children)
9
+ ? parsedChildren(el.props.children)
10
+ : [{ text: el.props.children }];
11
+ const childrenString = typeof el.props.children === "string" ? el.props.children : "";
12
+ switch (el.type) {
13
+ case "p":
14
+ return { type: "paragraph", children };
15
+ case "blockquote":
16
+ return { type: "blockQuote", children };
17
+ case "ul":
18
+ return { type: "bulletedList", children };
19
+ case "h1":
20
+ return { type: "headingOne", children };
21
+ case "h2":
22
+ return { type: "headingTwo", children };
23
+ case "li":
24
+ return { type: "listItem", children };
25
+ case "ol":
26
+ return { type: "numberedList", children };
27
+ case "strong":
28
+ return { text: childrenString, bold: true };
29
+ case "code":
30
+ return { text: childrenString, code: true };
31
+ case "em":
32
+ return { text: childrenString, italic: true };
33
+ case "u":
34
+ return { text: childrenString, underline: true };
35
+ default:
36
+ return { text: childrenString };
37
+ }
38
+ };
39
+ const getSlateFromHtml = (html) => {
40
+ const parsed = parse(html);
41
+ if (Array.isArray(parsed)) {
42
+ return parsed.flatMap((el) => {
43
+ if (typeof el === "string")
44
+ return { text: el };
45
+ return deserialize(el);
46
+ });
47
+ }
48
+ else if (typeof parsed === "string") {
49
+ return [{ text: parsed }];
50
+ }
51
+ else {
52
+ return [deserialize(parsed)];
53
+ }
54
+ };
55
+ export { getSlateFromHtml };
@@ -0,0 +1,4 @@
1
+ import { Descendant } from "slate";
2
+ declare function extractText(nodes: Descendant[]): string;
3
+ export { extractText };
4
+ //# sourceMappingURL=extractText.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractText.d.ts","sourceRoot":"","sources":["../../../../src/components/RichText/functions/extractText.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAQ,MAAM,OAAO,CAAC;AAEzC,iBAAS,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,UAEvC;AAED,OAAO,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import { Node } from "slate";
2
+ function extractText(nodes) {
3
+ return nodes.map((n) => Node.string(n)).join("");
4
+ }
5
+ export { extractText };
@@ -1,3 +1,4 @@
1
- declare const serialize: (node: any) => string;
2
- export { serialize };
1
+ import { Editor } from "slate";
2
+ declare const getHtmlFromSlate: (editor: Editor) => string;
3
+ export { getHtmlFromSlate };
3
4
  //# sourceMappingURL=serialize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../../../src/components/RichText/functions/serialize.ts"],"names":[],"mappings":"AAGA,QAAA,MAAM,SAAS,SAAU,GAAG,KAAG,MAgD9B,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
1
+ {"version":3,"file":"serialize.d.ts","sourceRoot":"","sources":["../../../../src/components/RichText/functions/serialize.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiC,MAAM,OAAO,CAAC;AA8C9D,QAAA,MAAM,gBAAgB,WAAY,MAAM,KAAG,MAE1C,CAAC;AAEF,OAAO,EAAE,gBAAgB,EAAE,CAAC"}
@@ -1,11 +1,21 @@
1
- // import { Node, Element as SlateElement } from "slate";
2
- import { Element as SlateElement } from "slate";
1
+ import { Element as SlateElement, Text } from "slate";
3
2
  const serialize = (node) => {
4
- // function exportHtml() {
5
- // const content = editor.children;
6
- // const html = content.map((node) => serialize(node)).join("");
7
- // setHtml(html);
8
- // }
3
+ if (Text.isText(node)) {
4
+ let text = node.text;
5
+ if (node.bold) {
6
+ text = `<strong>${text}</strong>`;
7
+ }
8
+ if (node.code) {
9
+ text = `<code>${text}</code>`;
10
+ }
11
+ if (node.italic) {
12
+ text = `<em>${text}</em>`;
13
+ }
14
+ if (node.underline) {
15
+ text = `<u>${text}</u>`;
16
+ }
17
+ return text;
18
+ }
9
19
  if (SlateElement.isElement(node)) {
10
20
  const children = node.children.map((n) => serialize(n)).join("");
11
21
  switch (node.type) {
@@ -27,22 +37,9 @@ const serialize = (node) => {
27
37
  return children;
28
38
  }
29
39
  }
30
- if (node.text) {
31
- let text = node.text;
32
- if (node.bold) {
33
- text = `<strong>${text}</strong>`;
34
- }
35
- if (node.code) {
36
- text = `<code>${text}</code>`;
37
- }
38
- if (node.italic) {
39
- text = `<em>${text}</em>`;
40
- }
41
- if (node.underline) {
42
- text = `<u>${text}</u>`;
43
- }
44
- return text;
45
- }
46
40
  return "";
47
41
  };
48
- export { serialize };
42
+ const getHtmlFromSlate = (editor) => {
43
+ return editor.children.map((node) => serialize(node)).join("");
44
+ };
45
+ export { getHtmlFromSlate };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichText/index.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAgB,UAAU,EAAoB,MAAM,OAAO,CAAC;AAanE,OAAO,cAAc,CAAC;AAGtB,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uBAAuB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,iBAAS,QAAQ,CAAC,EAChB,IAAI,EACJ,YAAY,EACZ,qBAA6B,EAC7B,uBAAuB,EACvB,QAAe,EACf,aAAa,EACb,QAAQ,EACR,OAAO,EAAE,WAAW,GACrB,EAAE,aAAa,2CAqHf;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/RichText/index.tsx"],"names":[],"mappings":"AAeA,OAAO,EAAgB,UAAU,EAAc,MAAM,OAAO,CAAC;AAc7D,OAAO,cAAc,CAAC;AAMtB,KAAK,aAAa,GAAG;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,uBAAuB,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACzC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC,CAAC;AAEF,iBAAS,QAAQ,CAAC,EAChB,IAAI,EACJ,YAAY,EACZ,qBAA6B,EAC7B,uBAAuB,EACvB,QAAe,EACf,aAAa,EACb,QAAQ,EACR,OAAO,EAAE,WAAW,GACrB,EAAE,aAAa,2CAwGf;AAED,OAAO,EAAE,QAAQ,EAAE,CAAC"}
@@ -2,7 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import isHotkey from "is-hotkey";
3
3
  import { AlignCenter, AlignJustify, AlignLeft, AlignRight, Bold, Code, Heading1, Heading2, Italic, Quote, Underline, } from "lucide-react";
4
4
  import { useCallback, useMemo, useRef, useState } from "react";
5
- import { createEditor, Transforms, Node } from "slate";
5
+ import { createEditor, Transforms } from "slate";
6
6
  import { withHistory } from "slate-history";
7
7
  import { Editable, Slate, withReact } from "slate-react";
8
8
  import { BlockButton } from "./components/BlockButton/intex";
@@ -13,21 +13,24 @@ import { Toolbar } from "./components/Toolbar";
13
13
  import { toggleMark } from "./functions/toggleMark";
14
14
  import { HOTKEYS } from "./template/HOTKEYS";
15
15
  import { INITIAL_VALUE } from "./template/INITIAL_VALUE";
16
- import "./styles.css";
17
16
  import { useFormController } from "../Form/FormController";
17
+ import "./styles.css";
18
+ import { getSlateFromHtml } from "./functions/deserialize";
19
+ import { extractText } from "./functions/extractText";
20
+ import { getHtmlFromSlate } from "./functions/serialize";
18
21
  function RichText({ name, defaultValue, enforceCharacterLimit = false, onChangeCharactersCount, maxLimit = 2000, onValueChange, onChange, isError: baseIsError, }) {
19
- function extractText(nodes) {
20
- return nodes.map((n) => Node.string(n)).join("");
21
- }
22
- const defaultNodes = defaultValue ? JSON.parse(defaultValue) : INITIAL_VALUE;
23
- const [charactersCount, setCharactersCount] = useState(extractText(defaultNodes).length);
24
- const [editorValue, setEditorValue] = useState(defaultNodes);
25
- const [onFocus, setOnFocus] = useState(false);
22
+ const editor = useMemo(() => withHistory(withReact(createEditor())), []);
26
23
  const { id, inputRef, error } = useFormController();
27
24
  const baseRef = useRef(null);
25
+ const defaultNodes = defaultValue
26
+ ? getSlateFromHtml(defaultValue)
27
+ : INITIAL_VALUE;
28
+ const textFromNodes = extractText(defaultNodes);
29
+ const [charactersCount, setCharactersCount] = useState(textFromNodes.length);
30
+ const [inputValue, setInputValue] = useState(defaultValue);
31
+ const [onFocus, setOnFocus] = useState(false);
28
32
  const ref = inputRef || baseRef;
29
33
  const isError = baseIsError || !!error;
30
- const editor = useMemo(() => withHistory(withReact(createEditor())), []);
31
34
  const renderLeaf = useCallback(Leaf, []);
32
35
  const renderElement = useCallback(Element, []);
33
36
  function handleChange(value) {
@@ -38,9 +41,9 @@ function RichText({ name, defaultValue, enforceCharacterLimit = false, onChangeC
38
41
  return;
39
42
  }
40
43
  else {
41
- setEditorValue(value);
44
+ setInputValue(getHtmlFromSlate(editor));
42
45
  onChange && onChange(value);
43
- onValueChange && onValueChange(text);
46
+ onValueChange && onValueChange(getHtmlFromSlate(editor));
44
47
  editor.children = value;
45
48
  Transforms.setNodes(editor, { children: value });
46
49
  }
@@ -53,7 +56,7 @@ function RichText({ name, defaultValue, enforceCharacterLimit = false, onChangeC
53
56
  : "errorFalse";
54
57
  const className = `arkynRichText ${errorClass} ${focusClass}`;
55
58
  const restatesCharacters = maxLimit - charactersCount;
56
- return (_jsxs(Slate, { editor: editor, initialValue: defaultValue ? JSON.parse(defaultValue) : INITIAL_VALUE, onChange: handleChange, onValueChange: handleChange, children: [_jsxs("div", { className: className, children: [_jsxs(Toolbar, { children: [_jsx(BlockButton, { format: "headingOne", icon: Heading1 }), _jsx(BlockButton, { format: "headingTwo", icon: Heading2 }), _jsx(BlockButton, { format: "blockQuote", icon: Quote }), _jsx(MarkButton, { format: "bold", icon: Bold }), _jsx(MarkButton, { format: "italic", icon: Italic }), _jsx(MarkButton, { format: "underline", icon: Underline }), _jsx(MarkButton, { format: "code", icon: Code }), _jsx(BlockButton, { format: "left", icon: AlignLeft }), _jsx(BlockButton, { format: "right", icon: AlignRight }), _jsx(BlockButton, { format: "center", icon: AlignCenter }), _jsx(BlockButton, { format: "justify", icon: AlignJustify })] }), _jsx(Editable, { className: "editorContainer", renderElement: renderElement, renderLeaf: renderLeaf, spellCheck: true, id: id, onFocus: () => setOnFocus(true), onBlur: () => setOnFocus(false), onKeyDown: (event) => {
59
+ return (_jsxs(Slate, { editor: editor, initialValue: defaultNodes, onChange: handleChange, onValueChange: handleChange, children: [_jsxs("div", { className: className, children: [_jsxs(Toolbar, { children: [_jsx(BlockButton, { format: "headingOne", icon: Heading1 }), _jsx(BlockButton, { format: "headingTwo", icon: Heading2 }), _jsx(BlockButton, { format: "blockQuote", icon: Quote }), _jsx(MarkButton, { format: "bold", icon: Bold }), _jsx(MarkButton, { format: "italic", icon: Italic }), _jsx(MarkButton, { format: "underline", icon: Underline }), _jsx(MarkButton, { format: "code", icon: Code }), _jsx(BlockButton, { format: "left", icon: AlignLeft }), _jsx(BlockButton, { format: "right", icon: AlignRight }), _jsx(BlockButton, { format: "center", icon: AlignCenter }), _jsx(BlockButton, { format: "justify", icon: AlignJustify })] }), _jsx(Editable, { className: "editorContainer", renderElement: renderElement, renderLeaf: renderLeaf, spellCheck: true, id: id, onFocus: () => setOnFocus(true), onBlur: () => setOnFocus(false), onKeyDown: (event) => {
57
60
  for (const hotkey in HOTKEYS) {
58
61
  if (isHotkey(hotkey, event)) {
59
62
  event.preventDefault();
@@ -61,6 +64,6 @@ function RichText({ name, defaultValue, enforceCharacterLimit = false, onChangeC
61
64
  toggleMark(editor, mark);
62
65
  }
63
66
  }
64
- } }), restatesCharacters < 0 && (_jsx("div", { className: "restatesCharacters", children: restatesCharacters }))] }), _jsx("input", { ref: ref, type: "hidden", name: name, value: JSON.stringify(editorValue) }), _jsx("input", { type: "hidden", name: `${name}Count`, value: charactersCount })] }));
67
+ } }), restatesCharacters < 0 && (_jsx("div", { className: "restatesCharacters", children: restatesCharacters }))] }), _jsx("input", { ref: ref, type: "hidden", name: name, value: inputValue }), _jsx("input", { type: "hidden", name: `${name}Count`, value: charactersCount })] }));
65
68
  }
66
69
  export { RichText };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@arkyn/components",
3
- "version": "1.3.120",
3
+ "version": "1.3.122",
4
4
  "main": "./dist/bundle.js",
5
5
  "types": "./dist/index.d.ts",
6
6
  "author": "Lucas Gonçalves",
@@ -14,6 +14,7 @@
14
14
  "@react-google-maps/api": "^2.19.3",
15
15
  "@react-input/mask": "^1.2.5",
16
16
  "framer-motion": "^11.3.21",
17
+ "html-react-parser": "^5.1.16",
17
18
  "is-hotkey": "^0.2.0",
18
19
  "lucide-react": "^0.424.0",
19
20
  "react-scroll": "^1.9.0",
@@ -24,6 +24,7 @@ type CustomElement = {
24
24
 
25
25
  type CustomText = {
26
26
  bold?: boolean;
27
+ text: string;
27
28
  italic?: boolean;
28
29
  code?: boolean;
29
30
  underline?: boolean;
@@ -0,0 +1,65 @@
1
+ import { Descendant } from "slate";
2
+ import parse from "html-react-parser";
3
+
4
+ type ParseElement =
5
+ | { type: string; props: { children: ParseElement[] | string } }
6
+ | "string";
7
+
8
+ const deserialize = (el: ParseElement): Descendant => {
9
+ if (typeof el === "string") return { text: el || "" };
10
+
11
+ function parsedChildren(children: ParseElement[]) {
12
+ return children.map((child) => deserialize(child));
13
+ }
14
+
15
+ const children = Array.isArray(el.props.children)
16
+ ? parsedChildren(el.props.children)
17
+ : [{ text: el.props.children }];
18
+
19
+ const childrenString =
20
+ typeof el.props.children === "string" ? el.props.children : "";
21
+
22
+ switch (el.type) {
23
+ case "p":
24
+ return { type: "paragraph", children };
25
+ case "blockquote":
26
+ return { type: "blockQuote", children };
27
+ case "ul":
28
+ return { type: "bulletedList", children };
29
+ case "h1":
30
+ return { type: "headingOne", children };
31
+ case "h2":
32
+ return { type: "headingTwo", children };
33
+ case "li":
34
+ return { type: "listItem", children };
35
+ case "ol":
36
+ return { type: "numberedList", children };
37
+ case "strong":
38
+ return { text: childrenString, bold: true };
39
+ case "code":
40
+ return { text: childrenString, code: true };
41
+ case "em":
42
+ return { text: childrenString, italic: true };
43
+ case "u":
44
+ return { text: childrenString, underline: true };
45
+ default:
46
+ return { text: childrenString };
47
+ }
48
+ };
49
+
50
+ const getSlateFromHtml = (html: string) => {
51
+ const parsed = parse(html);
52
+
53
+ if (Array.isArray(parsed)) {
54
+ return parsed.flatMap((el) => {
55
+ if (typeof el === "string") return { text: el };
56
+ return deserialize(el);
57
+ });
58
+ } else if (typeof parsed === "string") {
59
+ return [{ text: parsed }];
60
+ } else {
61
+ return [deserialize(parsed)];
62
+ }
63
+ };
64
+
65
+ export { getSlateFromHtml };
@@ -0,0 +1,7 @@
1
+ import { Descendant, Node } from "slate";
2
+
3
+ function extractText(nodes: Descendant[]) {
4
+ return nodes.map((n) => Node.string(n)).join("");
5
+ }
6
+
7
+ export { extractText };
@@ -1,12 +1,22 @@
1
- // import { Node, Element as SlateElement } from "slate";
2
- import { Element as SlateElement } from "slate";
1
+ import { Editor, Element as SlateElement, Text } from "slate";
3
2
 
4
3
  const serialize = (node: any): string => {
5
- // function exportHtml() {
6
- // const content = editor.children;
7
- // const html = content.map((node) => serialize(node)).join("");
8
- // setHtml(html);
9
- // }
4
+ if (Text.isText(node)) {
5
+ let text = node.text;
6
+ if (node.bold) {
7
+ text = `<strong>${text}</strong>`;
8
+ }
9
+ if (node.code) {
10
+ text = `<code>${text}</code>`;
11
+ }
12
+ if (node.italic) {
13
+ text = `<em>${text}</em>`;
14
+ }
15
+ if (node.underline) {
16
+ text = `<u>${text}</u>`;
17
+ }
18
+ return text;
19
+ }
10
20
 
11
21
  if (SlateElement.isElement(node)) {
12
22
  const children = node.children.map((n: any) => serialize(n)).join("");
@@ -31,24 +41,11 @@ const serialize = (node: any): string => {
31
41
  }
32
42
  }
33
43
 
34
- if (node.text) {
35
- let text = node.text;
36
- if (node.bold) {
37
- text = `<strong>${text}</strong>`;
38
- }
39
- if (node.code) {
40
- text = `<code>${text}</code>`;
41
- }
42
- if (node.italic) {
43
- text = `<em>${text}</em>`;
44
- }
45
- if (node.underline) {
46
- text = `<u>${text}</u>`;
47
- }
48
- return text;
49
- }
50
-
51
44
  return "";
52
45
  };
53
46
 
54
- export { serialize };
47
+ const getHtmlFromSlate = (editor: Editor): string => {
48
+ return editor.children.map((node) => serialize(node)).join("");
49
+ };
50
+
51
+ export { getHtmlFromSlate };
@@ -13,7 +13,7 @@ import {
13
13
  Underline,
14
14
  } from "lucide-react";
15
15
  import { useCallback, useMemo, useRef, useState } from "react";
16
- import { createEditor, Descendant, Transforms, Node } from "slate";
16
+ import { createEditor, Descendant, Transforms } from "slate";
17
17
  import { withHistory } from "slate-history";
18
18
  import { Editable, Slate, withReact } from "slate-react";
19
19
 
@@ -26,8 +26,12 @@ import { toggleMark } from "./functions/toggleMark";
26
26
  import { HOTKEYS } from "./template/HOTKEYS";
27
27
  import { INITIAL_VALUE } from "./template/INITIAL_VALUE";
28
28
 
29
- import "./styles.css";
30
29
  import { useFormController } from "../Form/FormController";
30
+ import "./styles.css";
31
+
32
+ import { getSlateFromHtml } from "./functions/deserialize";
33
+ import { extractText } from "./functions/extractText";
34
+ import { getHtmlFromSlate } from "./functions/serialize";
31
35
 
32
36
  type RichTextProps = {
33
37
  name: string;
@@ -50,44 +54,40 @@ function RichText({
50
54
  onChange,
51
55
  isError: baseIsError,
52
56
  }: RichTextProps) {
53
- function extractText(nodes: Descendant[]) {
54
- return nodes.map((n) => Node.string(n)).join("");
55
- }
56
-
57
- const defaultNodes = defaultValue ? JSON.parse(defaultValue) : INITIAL_VALUE;
57
+ const editor = useMemo(() => withHistory(withReact(createEditor())), []);
58
+ const { id, inputRef, error } = useFormController();
58
59
 
59
- const [charactersCount, setCharactersCount] = useState(
60
- extractText(defaultNodes).length
61
- );
60
+ const baseRef = useRef<HTMLInputElement>(null);
62
61
 
63
- const [editorValue, setEditorValue] = useState<Descendant[]>(defaultNodes);
64
- const [onFocus, setOnFocus] = useState(false);
62
+ const defaultNodes = defaultValue
63
+ ? getSlateFromHtml(defaultValue)
64
+ : INITIAL_VALUE;
65
65
 
66
- const { id, inputRef, error } = useFormController();
66
+ const textFromNodes = extractText(defaultNodes);
67
67
 
68
- const baseRef = useRef<HTMLInputElement>(null);
68
+ const [charactersCount, setCharactersCount] = useState(textFromNodes.length);
69
+ const [inputValue, setInputValue] = useState(defaultValue);
70
+ const [onFocus, setOnFocus] = useState(false);
69
71
 
70
72
  const ref = inputRef || baseRef;
71
73
  const isError = baseIsError || !!error;
72
74
 
73
- const editor = useMemo(() => withHistory(withReact(createEditor())), []);
74
-
75
75
  const renderLeaf = useCallback(Leaf, []);
76
76
  const renderElement = useCallback(Element, []);
77
77
 
78
78
  function handleChange(value: Descendant[]) {
79
79
  const text = extractText(value);
80
- setCharactersCount(text.length);
81
80
 
81
+ setCharactersCount(text.length);
82
82
  onChangeCharactersCount && onChangeCharactersCount(text.length);
83
83
 
84
84
  if (enforceCharacterLimit && text.length >= maxLimit) {
85
85
  return;
86
86
  } else {
87
- setEditorValue(value);
87
+ setInputValue(getHtmlFromSlate(editor));
88
88
 
89
89
  onChange && onChange(value);
90
- onValueChange && onValueChange(text);
90
+ onValueChange && onValueChange(getHtmlFromSlate(editor));
91
91
 
92
92
  editor.children = value;
93
93
  Transforms.setNodes(editor, { children: value });
@@ -108,7 +108,7 @@ function RichText({
108
108
  return (
109
109
  <Slate
110
110
  editor={editor}
111
- initialValue={defaultValue ? JSON.parse(defaultValue) : INITIAL_VALUE}
111
+ initialValue={defaultNodes}
112
112
  onChange={handleChange}
113
113
  onValueChange={handleChange}
114
114
  >
@@ -117,9 +117,6 @@ function RichText({
117
117
  <BlockButton format="headingOne" icon={Heading1} />
118
118
  <BlockButton format="headingTwo" icon={Heading2} />
119
119
  <BlockButton format="blockQuote" icon={Quote} />
120
- {/* <BlockButton format="bulletedList" icon={ListVideo} /> */}
121
- {/* <BlockButton format="listItem" icon={List} /> */}
122
- {/* <BlockButton format="numberedList" icon={ListOrdered} /> */}
123
120
 
124
121
  <MarkButton format="bold" icon={Bold} />
125
122
  <MarkButton format="italic" icon={Italic} />
@@ -156,13 +153,7 @@ function RichText({
156
153
  )}
157
154
  </div>
158
155
 
159
- <input
160
- ref={ref}
161
- type="hidden"
162
- name={name}
163
- value={JSON.stringify(editorValue)}
164
- />
165
-
156
+ <input ref={ref} type="hidden" name={name} value={inputValue} />
166
157
  <input type="hidden" name={`${name}Count`} value={charactersCount} />
167
158
  </Slate>
168
159
  );