@flozy/editor 1.0.0 → 1.0.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (112) hide show
  1. package/build/asset-manifest.json +14 -0
  2. package/build/index.html +1 -0
  3. package/build/static/css/main.71100b24.css +2 -0
  4. package/build/static/css/main.71100b24.css.map +1 -0
  5. package/build/static/js/main.dd36b23b.js +3 -0
  6. package/build/static/js/main.dd36b23b.js.LICENSE.txt +19 -0
  7. package/build/static/js/main.dd36b23b.js.map +1 -0
  8. package/package.json +6 -2
  9. package/.eslintignore +0 -4
  10. package/.eslintrc.json +0 -6
  11. package/.github/workflows/npm-publish.yml +0 -33
  12. package/.husky/pre-commit +0 -1
  13. package/.storybook/main.js +0 -20
  14. package/.storybook/preview.js +0 -14
  15. package/.vscode/extensions.json +0 -7
  16. package/.vscode/launch.json +0 -15
  17. package/.vscode/settings.json +0 -22
  18. package/craco.config.js +0 -16
  19. package/public/index.html +0 -43
  20. package/src/components/Editor/CollaborativeEditor.js +0 -119
  21. package/src/components/Editor/CommonEditor.js +0 -549
  22. package/src/components/Editor/Editor.css +0 -115
  23. package/src/components/Editor/Elements/CodeToText/CodeToText.css +0 -57
  24. package/src/components/Editor/Elements/CodeToText/CodeToText.jsx +0 -115
  25. package/src/components/Editor/Elements/CodeToText/CodeToTextButton.jsx +0 -16
  26. package/src/components/Editor/Elements/CodeToText/HtmlCode.jsx +0 -59
  27. package/src/components/Editor/Elements/CodeToText/HtmlContextMenu.jsx +0 -39
  28. package/src/components/Editor/Elements/Color Picker/ColorPicker.css +0 -38
  29. package/src/components/Editor/Elements/Color Picker/ColorPicker.jsx +0 -110
  30. package/src/components/Editor/Elements/Color Picker/defaultColors.js +0 -34
  31. package/src/components/Editor/Elements/Embed/Embed.css +0 -14
  32. package/src/components/Editor/Elements/Embed/Embed.jsx +0 -74
  33. package/src/components/Editor/Elements/Embed/Image.jsx +0 -82
  34. package/src/components/Editor/Elements/Embed/Video.jsx +0 -65
  35. package/src/components/Editor/Elements/Equation/Equation.jsx +0 -19
  36. package/src/components/Editor/Elements/Equation/EquationButton.jsx +0 -59
  37. package/src/components/Editor/Elements/Equation/styles.css +0 -4
  38. package/src/components/Editor/Elements/Grid/Grid.js +0 -48
  39. package/src/components/Editor/Elements/Grid/GridButton.js +0 -21
  40. package/src/components/Editor/Elements/Grid/GridItem.js +0 -57
  41. package/src/components/Editor/Elements/ID/Id.jsx +0 -56
  42. package/src/components/Editor/Elements/Link/Link.jsx +0 -24
  43. package/src/components/Editor/Elements/Link/LinkButton.jsx +0 -71
  44. package/src/components/Editor/Elements/Link/styles.css +0 -20
  45. package/src/components/Editor/Elements/Mentions/Mentions.jsx +0 -37
  46. package/src/components/Editor/Elements/NewLine/NewLineButton.js +0 -29
  47. package/src/components/Editor/Elements/Table/Table.jsx +0 -13
  48. package/src/components/Editor/Elements/Table/TableSelector.css +0 -18
  49. package/src/components/Editor/Elements/Table/TableSelector.jsx +0 -76
  50. package/src/components/Editor/Elements/TableContextMenu/TableContextMenu.jsx +0 -97
  51. package/src/components/Editor/Elements/TableContextMenu/styles.css +0 -18
  52. package/src/components/Editor/RemoteCursorOverlay/Overlay.js +0 -78
  53. package/src/components/Editor/Toolbar/Toolbar.jsx +0 -167
  54. package/src/components/Editor/Toolbar/styles.css +0 -28
  55. package/src/components/Editor/Toolbar/toolbarGroups.js +0 -167
  56. package/src/components/Editor/Toolbar/toolbarIcons/align-center.svg +0 -1
  57. package/src/components/Editor/Toolbar/toolbarIcons/align-left.svg +0 -1
  58. package/src/components/Editor/Toolbar/toolbarIcons/align-right.svg +0 -1
  59. package/src/components/Editor/Toolbar/toolbarIcons/blockquote.svg +0 -1
  60. package/src/components/Editor/Toolbar/toolbarIcons/bold.png +0 -0
  61. package/src/components/Editor/Toolbar/toolbarIcons/fontColor.svg +0 -4
  62. package/src/components/Editor/Toolbar/toolbarIcons/headingOne.svg +0 -3
  63. package/src/components/Editor/Toolbar/toolbarIcons/headingTwo.svg +0 -3
  64. package/src/components/Editor/Toolbar/toolbarIcons/italic.png +0 -0
  65. package/src/components/Editor/Toolbar/toolbarIcons/link.svg +0 -1
  66. package/src/components/Editor/Toolbar/toolbarIcons/orderedList.svg +0 -1
  67. package/src/components/Editor/Toolbar/toolbarIcons/strikethrough.png +0 -0
  68. package/src/components/Editor/Toolbar/toolbarIcons/subscript.svg +0 -1
  69. package/src/components/Editor/Toolbar/toolbarIcons/superscript.svg +0 -1
  70. package/src/components/Editor/Toolbar/toolbarIcons/textColor.png +0 -0
  71. package/src/components/Editor/Toolbar/toolbarIcons/underline.png +0 -0
  72. package/src/components/Editor/Toolbar/toolbarIcons/unorderedList.svg +0 -1
  73. package/src/components/Editor/YjsProvider.js +0 -11
  74. package/src/components/Editor/common/Button.jsx +0 -12
  75. package/src/components/Editor/common/Icon.jsx +0 -82
  76. package/src/components/Editor/common/MentionsPopup.jsx +0 -56
  77. package/src/components/Editor/hooks/useMentions.js +0 -44
  78. package/src/components/Editor/hooks/withCollaborative.js +0 -15
  79. package/src/components/Editor/hooks/withCommon.js +0 -17
  80. package/src/components/Editor/plugins/withEmbeds.js +0 -36
  81. package/src/components/Editor/plugins/withEquation.js +0 -8
  82. package/src/components/Editor/plugins/withLinks.js +0 -9
  83. package/src/components/Editor/plugins/withMentions.js +0 -19
  84. package/src/components/Editor/plugins/withTable.js +0 -74
  85. package/src/components/Editor/utils/SlateUtilityFunctions.js +0 -273
  86. package/src/components/Editor/utils/customHooks/useContextMenu.js +0 -42
  87. package/src/components/Editor/utils/customHooks/useFormat.js +0 -26
  88. package/src/components/Editor/utils/customHooks/usePopup.jsx +0 -26
  89. package/src/components/Editor/utils/customHooks/useResize.js +0 -41
  90. package/src/components/Editor/utils/draftToSlate.js +0 -104
  91. package/src/components/Editor/utils/embed.js +0 -18
  92. package/src/components/Editor/utils/equation.js +0 -22
  93. package/src/components/Editor/utils/events.js +0 -56
  94. package/src/components/Editor/utils/grid.js +0 -12
  95. package/src/components/Editor/utils/gridItem.js +0 -19
  96. package/src/components/Editor/utils/link.js +0 -53
  97. package/src/components/Editor/utils/mentions.js +0 -11
  98. package/src/components/Editor/utils/paragraph.js +0 -4
  99. package/src/components/Editor/utils/serializer.js +0 -32
  100. package/src/components/Editor/utils/table.js +0 -151
  101. package/src/components/index.js +0 -5
  102. package/src/index.js +0 -1
  103. package/src/stories/CollaborativeEditor.stories.js +0 -30
  104. package/src/stories/Editor.stories.js +0 -24
  105. package/src/stories/EditorSampleProps/ChatSample.js +0 -43
  106. package/src/stories/EditorSampleProps/LayoutOne.js +0 -551
  107. /package/{public → build}/favicon.ico +0 -0
  108. /package/{public → build}/logo192.png +0 -0
  109. /package/{public → build}/logo512.png +0 -0
  110. /package/{public → build}/manifest.json +0 -0
  111. /package/{public → build}/robots.txt +0 -0
  112. /package/{src/components/Editor/Toolbar/toolbarIcons/unlink.svg → build/static/media/unlink.b8761030d4a17499149d2d61adc064b3.svg} +0 -0
@@ -1,44 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- import { Editor, Range } from "slate";
3
-
4
- const useMentions = (props) => {
5
- const { editor, selection } = props;
6
- const [mentions, setMentions] = useState({
7
- target: null,
8
- index: null,
9
- search: null,
10
- });
11
-
12
- useEffect(() => {
13
- if (selection && Range.isCollapsed(selection)) {
14
- const [start] = Range.edges(selection);
15
- const wordBefore = Editor.before(editor, start, { unit: "word" });
16
- const before = wordBefore && Editor.before(editor, wordBefore);
17
- const beforeRange = before && Editor.range(editor, before, start);
18
- const beforeText = beforeRange && Editor.string(editor, beforeRange);
19
- const beforeMatch = beforeText && beforeText.match(/^@(\w+)$/);
20
- const after = Editor.after(editor, start);
21
- const afterRange = Editor.range(editor, start, after);
22
- const afterText = Editor.string(editor, afterRange);
23
- const afterMatch = afterText.match(/^(\s|$)/);
24
-
25
- if (beforeMatch && afterMatch) {
26
- setMentions({
27
- target: beforeRange,
28
- search: beforeMatch[1],
29
- index: 0,
30
- });
31
- }
32
- } else {
33
- setMentions({
34
- target: null,
35
- search: null,
36
- index: null,
37
- });
38
- }
39
- }, [selection, editor]);
40
-
41
- return [mentions, setMentions];
42
- };
43
-
44
- export default useMentions;
@@ -1,15 +0,0 @@
1
- import { createEditor } from "slate";
2
- import { withYjs, withCursors } from "@slate-yjs/core";
3
-
4
- const withCollaborative = (props) => {
5
- const { provider, sharedType, data } = props;
6
- return withCursors(
7
- withYjs(createEditor(), sharedType, { autoConnect: false }),
8
- provider.awareness,
9
- {
10
- data,
11
- }
12
- );
13
- };
14
-
15
- export default withCollaborative;
@@ -1,17 +0,0 @@
1
- import { withReact } from "slate-react";
2
- import { withHistory } from "slate-history";
3
- import withLinks from "../plugins/withLinks";
4
- import withTables from "../plugins/withTable";
5
- import withEmbeds from "../plugins/withEmbeds";
6
- import withEquation from "../plugins/withEquation";
7
- import withMentions from "../plugins/withMentions";
8
-
9
- const withCommon = (props) => {
10
- return withEquation(
11
- withHistory(
12
- withEmbeds(withTables(withLinks(withMentions(withReact(props)))))
13
- )
14
- );
15
- };
16
-
17
- export default withCommon;
@@ -1,36 +0,0 @@
1
- import {Transforms, Path, Node} from 'slate'
2
-
3
- const withEmbeds = (editor) =>{
4
-
5
- const { isVoid, insertBreak } = editor;
6
-
7
- editor.isVoid = (element) => ['video','image','htmlCode'].includes(element.type) ? true : isVoid(element);
8
-
9
-
10
-
11
- editor.insertBreak = (...args) => {
12
- const parentPath = Path.parent(editor.selection.focus.path);
13
- const parentNode = Node.get(editor, parentPath);
14
- // console.log(parentNode);
15
- if (editor.isVoid(parentNode)) {
16
- const nextPath = Path.next(parentPath);
17
- Transforms.insertNodes(
18
- editor,
19
- {
20
- type: 'paragraph',
21
- children: [{ text: '' }]
22
- },
23
- {
24
- at: nextPath,
25
- select: true // Focus on this node once inserted
26
- }
27
- );
28
- } else {
29
- insertBreak(...args);
30
- }
31
- }
32
- return editor;
33
- }
34
-
35
-
36
- export default withEmbeds
@@ -1,8 +0,0 @@
1
- const withEquation = (editor) =>{
2
- const { isInline } = editor;
3
- editor.isInline = (element) =>
4
- element.type === 'equation' && element.inline ? true : isInline(element)
5
- return editor;
6
- }
7
-
8
- export default withEquation;
@@ -1,9 +0,0 @@
1
- const withLinks = (editor)=>{
2
-
3
- const { isInline } = editor;
4
- editor.isInline = (element) =>
5
- element.type === 'link' ? true :isInline(element);
6
- return editor;
7
- };
8
-
9
- export default withLinks;
@@ -1,19 +0,0 @@
1
- const withMentions = (editor) => {
2
- const { isInline, isVoid, markableVoid } = editor;
3
-
4
- editor.isInline = (element) => {
5
- return element.type === "mention" ? true : isInline(element);
6
- };
7
-
8
- editor.isVoid = (element) => {
9
- return element.type === "mention" ? true : isVoid(element);
10
- };
11
-
12
- editor.markableVoid = (element) => {
13
- return element.type === "mention" || markableVoid(element);
14
- };
15
-
16
- return editor;
17
- };
18
-
19
- export default withMentions;
@@ -1,74 +0,0 @@
1
- import { Editor, Range, Point, Element } from "slate";
2
-
3
- const withTable = (editor) => {
4
- const { deleteBackward, deleteForward } = editor;
5
-
6
- editor.deleteBackward = (unit) => {
7
- const { selection } = editor;
8
- if (selection) {
9
- const [cell] = Editor.nodes(editor, {
10
- match: (n) =>
11
- !Editor.isEditor(n) &&
12
- Element.isElement(n) &&
13
- n.type === "table-cell",
14
- });
15
- const prevNodePath = Editor.before(editor, selection);
16
-
17
- const [tableNode] = Editor.nodes(editor, {
18
- at: prevNodePath,
19
- match: (n) =>
20
- !Editor.isEditor(n) && Element.isElement && n.type === "table-cell",
21
- });
22
-
23
- if (cell) {
24
- const [, cellPath] = cell;
25
-
26
- const start = Editor.start(editor, cellPath);
27
- if (Point.equals(selection.anchor, start)) {
28
- return;
29
- }
30
- }
31
- if (!cell && tableNode) {
32
- return;
33
- }
34
- }
35
-
36
- deleteBackward(unit);
37
- };
38
- editor.deleteForward = (unit) => {
39
- const { selection } = editor;
40
- if (selection && Range.isCollapsed(selection)) {
41
- const [cell] = Editor.nodes(editor, {
42
- match: (n) =>
43
- !Editor.isEditor(n) &&
44
- Element.isElement(n) &&
45
- n.type === "table-cell",
46
- });
47
-
48
- const prevNodePath = Editor.after(editor, selection);
49
- const [tableNode] = Editor.nodes(editor, {
50
- at: prevNodePath,
51
- match: (n) =>
52
- !Editor.isEditor(n) && Element.isElement && n.type === "table-cell",
53
- });
54
-
55
- if (cell) {
56
- const [, cellPath] = cell;
57
- const end = Editor.end(editor, cellPath);
58
-
59
- if (Point.equals(selection.anchor, end)) {
60
- return;
61
- }
62
- }
63
- if (!cell && tableNode) {
64
- return;
65
- }
66
- }
67
-
68
- deleteForward(unit);
69
- };
70
-
71
- return editor;
72
- };
73
-
74
- export default withTable;
@@ -1,273 +0,0 @@
1
- import { Editor, Transforms, Element as SlateElement } from "slate";
2
- import Link from "../Elements/Link/Link";
3
- import Image from "../Elements/Embed/Image";
4
- import Video from "../Elements/Embed/Video";
5
- import Equation from "../Elements/Equation/Equation";
6
- import HtmlCode from "../Elements/CodeToText/HtmlCode";
7
- import Table from "../Elements/Table/Table";
8
- import Mentions from "../Elements/Mentions/Mentions";
9
- import Grid from "../Elements/Grid/Grid";
10
- import GridItem from "../Elements/Grid/GridItem";
11
-
12
- const alignment = ["alignLeft", "alignRight", "alignCenter"];
13
- const list_types = ["orderedList", "unorderedList"];
14
-
15
- export const sizeMap = {
16
- small: "0.75em",
17
- normal: "1em",
18
- medium: "1.75em",
19
- huge: "2.5em",
20
- };
21
- export const fontFamilyMap = {
22
- sans: "Helvetica,Arial, sans serif",
23
- serif: "Georgia, Times New Roaman,serif",
24
- monospace: "Monaco, Courier New,monospace",
25
- };
26
- export const toggleBlock = (editor, format) => {
27
- const isActive = isBlockActive(editor, format);
28
- const isList = list_types.includes(format);
29
- const isIndent = alignment.includes(format);
30
- const isAligned = alignment.some((alignmentType) =>
31
- isBlockActive(editor, alignmentType)
32
- );
33
-
34
- /*If the node is already aligned and change in indent is called we should unwrap it first and split the node to prevent
35
- messy, nested DOM structure and bugs due to that.*/
36
- if (isAligned && isIndent) {
37
- Transforms.unwrapNodes(editor, {
38
- match: (n) =>
39
- alignment.includes(
40
- !Editor.isEditor(n) && SlateElement.isElement(n) && n.type
41
- ),
42
- split: true,
43
- });
44
- }
45
-
46
- /* Wraping the nodes for alignment, to allow it to co-exist with other block level operations*/
47
- if (isIndent) {
48
- Transforms.wrapNodes(editor, {
49
- type: format,
50
- children: [],
51
- });
52
- return;
53
- }
54
- Transforms.unwrapNodes(editor, {
55
- match: (n) =>
56
- list_types.includes(
57
- !Editor.isEditor(n) && SlateElement.isElement(n) && n.type
58
- ),
59
- split: true,
60
- });
61
-
62
- Transforms.setNodes(editor, {
63
- type: isActive ? "paragraph" : isList ? "list-item" : format,
64
- });
65
-
66
- if (isList && !isActive) {
67
- Transforms.wrapNodes(editor, {
68
- type: format,
69
- children: [],
70
- });
71
- }
72
- };
73
- export const addMarkData = (editor, data) => {
74
- Editor.addMark(editor, data.format, data.value);
75
- };
76
- export const toggleMark = (editor, format) => {
77
- const isActive = isMarkActive(editor, format);
78
-
79
- if (isActive) {
80
- Editor.removeMark(editor, format);
81
- } else {
82
- Editor.addMark(editor, format, true);
83
- }
84
- };
85
- export const isMarkActive = (editor, format) => {
86
- const marks = Editor.marks(editor);
87
-
88
- return marks ? marks[format] === true : false;
89
- };
90
-
91
- export const isBlockActive = (editor, format) => {
92
- const [match] = Editor.nodes(editor, {
93
- match: (n) =>
94
- !Editor.isEditor(n) && SlateElement.isElement(n) && n.type === format,
95
- });
96
-
97
- return !!match;
98
- };
99
-
100
- export const activeMark = (editor, format) => {
101
- const defaultMarkData = {
102
- color: "black",
103
- bgColor: "black",
104
- fontSize: "normal",
105
- fontFamily: "sans",
106
- };
107
- const marks = Editor.marks(editor);
108
- const defaultValue = defaultMarkData[format];
109
- return marks?.[format] ?? defaultValue;
110
- };
111
-
112
- export const getMarked = (leaf, children) => {
113
- if (leaf.bold) {
114
- children = <strong>{children}</strong>;
115
- }
116
-
117
- if (leaf.code) {
118
- children = <code>{children}</code>;
119
- }
120
-
121
- if (leaf.italic) {
122
- children = <em>{children}</em>;
123
- }
124
- if (leaf.strikethrough) {
125
- children = (
126
- <span style={{ textDecoration: "line-through" }}>{children}</span>
127
- );
128
- }
129
- if (leaf.underline) {
130
- children = <u>{children}</u>;
131
- }
132
- if (leaf.superscript) {
133
- children = <sup>{children}</sup>;
134
- }
135
- if (leaf.subscript) {
136
- children = <sub>{children}</sub>;
137
- }
138
- if (leaf.color) {
139
- children = <span style={{ color: leaf.color }}>{children}</span>;
140
- }
141
- if (leaf.bgColor) {
142
- children = (
143
- <span style={{ backgroundColor: leaf.bgColor }}>{children}</span>
144
- );
145
- }
146
- if (leaf.fontSize) {
147
- const size = sizeMap[leaf.fontSize];
148
- children = <span style={{ fontSize: size }}>{children}</span>;
149
- }
150
- if (leaf.fontFamily) {
151
- const family = fontFamilyMap[leaf.fontFamily];
152
- children = <span style={{ fontFamily: family }}>{children}</span>;
153
- }
154
- return children;
155
- };
156
-
157
- export const getBlock = (props) => {
158
- const { element, children } = props;
159
- const attributes = props.attributes ?? {};
160
-
161
- switch (element.type) {
162
- case "headingOne":
163
- return (
164
- <h1 {...attributes} {...element.attr}>
165
- {children}
166
- </h1>
167
- );
168
- case "headingTwo":
169
- return (
170
- <h2 {...attributes} {...element.attr}>
171
- {children}
172
- </h2>
173
- );
174
- case "headingThree":
175
- return (
176
- <h3 {...attributes} {...element.attr}>
177
- {children}
178
- </h3>
179
- );
180
- case "blockquote":
181
- return (
182
- <blockquote {...attributes} {...element.attr}>
183
- {children}
184
- </blockquote>
185
- );
186
- case "alignLeft":
187
- return (
188
- <div
189
- style={{ listStylePosition: "inside" }}
190
- {...attributes}
191
- {...element.attr}
192
- >
193
- {children}
194
- </div>
195
- );
196
- case "alignCenter":
197
- return (
198
- <div
199
- style={{
200
- display: "flex",
201
- alignItems: "center",
202
- listStylePosition: "inside",
203
- flexDirection: "column",
204
- }}
205
- {...attributes}
206
- {...element.attr}
207
- >
208
- {children}
209
- </div>
210
- );
211
- case "alignRight":
212
- return (
213
- <div
214
- style={{
215
- display: "flex",
216
- alignItems: "flex-end",
217
- listStylePosition: "inside",
218
- flexDirection: "column",
219
- }}
220
- {...attributes}
221
- {...element.attr}
222
- >
223
- {children}
224
- </div>
225
- );
226
- case "list-item":
227
- return (
228
- <li {...attributes} {...element.attr}>
229
- {children}
230
- </li>
231
- );
232
- case "orderedList":
233
- return (
234
- <ol type="1" {...attributes}>
235
- {children}
236
- </ol>
237
- );
238
- case "unorderedList":
239
- return <ul {...attributes}>{children}</ul>;
240
- case "link":
241
- return <Link {...props} />;
242
- case "table":
243
- return <Table {...props} />;
244
- case "table-row":
245
- return <tr {...attributes}>{children}</tr>;
246
- case "table-cell":
247
- return (
248
- <td {...element.attr} {...attributes}>
249
- {children}
250
- </td>
251
- );
252
- case "image":
253
- return <Image {...props} />;
254
- case "video":
255
- return <Video {...props} />;
256
- case "equation":
257
- return <Equation {...props} />;
258
- case "htmlCode":
259
- return <HtmlCode {...props} />;
260
- case "mention":
261
- return <Mentions {...props} />;
262
- case "grid":
263
- return <Grid {...props} />;
264
- case "grid-item":
265
- return <GridItem {...props} />;
266
- default:
267
- return (
268
- <div {...element.attr} {...attributes}>
269
- {children}
270
- </div>
271
- );
272
- }
273
- };
@@ -1,42 +0,0 @@
1
- import { useState, useEffect } from 'react';
2
- import useFormat from './useFormat.js';
3
-
4
-
5
- //This hook returns should we show the custom context menu and where to show it.
6
- const useContextMenu = (editor,format,setSelection) => {
7
- const isFormat = useFormat(editor,format);
8
- const [showMenu,setShowMenu] = useState(false);
9
- const [menuLocation,setMenuLocation] = useState({
10
- top:'0px',
11
- left:'0px'
12
- });
13
-
14
- const handleClick = ()=>{
15
- setShowMenu(false);
16
- }
17
- const handleContextMenu = (e) => {
18
- if(!isFormat) return;
19
- setSelection(editor.selection);
20
- e.preventDefault();
21
- setShowMenu(true);
22
- const xPos = e.pageX + "px";
23
- const yPos = e.pageY + "px";
24
- setMenuLocation({
25
- top:yPos,
26
- left:xPos
27
- })
28
- }
29
- useEffect(()=>{
30
- document.addEventListener('click',handleClick);
31
- document.addEventListener('contextmenu',handleContextMenu);
32
-
33
- return ()=>{
34
- document.removeEventListener('click',handleClick);
35
- document.removeEventListener('contextmenu',handleContextMenu);
36
- }
37
- },[isFormat])
38
-
39
- return [showMenu,menuLocation];
40
- }
41
-
42
- export default useContextMenu;
@@ -1,26 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
- import { Editor, Element } from 'slate'
3
-
4
-
5
- // This hook returns if the node in the current selection matches the format passed to it.
6
- const useFormat = (editor,format)=>{
7
- const [isFormat,setIsFormat] = useState(false);
8
- useEffect(()=>{
9
- if(editor.selection){
10
- // It matches at the editor.selection location by default, so if null handle it seperately.
11
- const [node] = Editor.nodes(editor,{
12
- match:n => !Editor.isEditor(n) && Element.isElement(n) && n.type === format
13
- })
14
-
15
- setIsFormat(!!node);
16
- }
17
- else{
18
- setIsFormat(false);
19
- }
20
- // eslint-disable-next-line react-hooks/exhaustive-deps
21
- },[editor.selection])
22
-
23
- return isFormat;
24
- }
25
-
26
- export default useFormat;
@@ -1,26 +0,0 @@
1
- import { useState, useEffect } from 'react'
2
-
3
- //This hook returns if the click was inside the popUp ref or outside it .
4
- function usePopup(popupRef) {
5
- const [showPopup,setShowPopup] = useState(false);
6
-
7
- useEffect(()=>{
8
- const handleDocumentClick = (e)=>{
9
- const clickedComponent = e.target;
10
- if(!popupRef?.current?.contains(clickedComponent)){
11
- setShowPopup(false);
12
- }
13
- }
14
- document.addEventListener('click',handleDocumentClick);
15
-
16
- return ()=>{
17
- document.removeEventListener('click',handleDocumentClick)
18
- }
19
- // eslint-disable-next-line react-hooks/exhaustive-deps
20
- }, [])
21
-
22
- return [showPopup,setShowPopup];
23
- }
24
-
25
- export default usePopup
26
-
@@ -1,41 +0,0 @@
1
- import { useState } from "react";
2
-
3
- const useResize = ({ parentDOM, size: defaultSize }) => {
4
- const { width } = parentDOM?.getBoundingClientRect() || { ...defaultSize };
5
- const [size, setSize] = useState({
6
- height: 300,
7
- widthInPercent: 100,
8
- ...defaultSize,
9
- });
10
- const [resizing, setResizing] = useState(false);
11
-
12
- const onLoad = (dom) => {
13
- setSize({ widthInPercent: 100, height: 300, ...defaultSize });
14
- };
15
-
16
- const onMouseDown = () => {
17
- document.addEventListener("pointermove", onMouseMove);
18
- document.addEventListener("pointerup", onMouseUp);
19
- setResizing(true);
20
- };
21
- const onMouseUp = () => {
22
- document.removeEventListener("pointermove", onMouseMove);
23
- document.removeEventListener("pointerup", onMouseUp);
24
- setResizing(false);
25
- };
26
- const onMouseMove = (e) => {
27
- setSize((currentSize) => {
28
- const widthInPX = (currentSize.widthInPercent / 100) * width;
29
- const calcWidth = widthInPX + e.movementX;
30
- return {
31
- width: calcWidth,
32
- height: currentSize.height + e.movementY,
33
- widthInPercent: (calcWidth / width) * 100,
34
- };
35
- });
36
- };
37
-
38
- return [size, onMouseDown, resizing, onLoad];
39
- };
40
-
41
- export default useResize;