-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathEditorToolbar.tsx
67 lines (54 loc) · 1.78 KB
/
EditorToolbar.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import React from 'react';
import { Editor } from 'slate-react';
import styled from 'styled-components';
import EditorHandler from '../../helpers/EditorHandler';
import Colors from './styles/Colors';
interface ToolbarProps extends React.HTMLAttributes<HTMLDivElement> {
editor: Editor | null,
children: React.ReactElement<any>[] | React.ReactElement<any> | undefined,
onToggleBlock?: (event: React.MouseEvent, type: string) => void,
onToggleMark?: (event: React.MouseEvent, type: string) => void
}
const EditorToolbar: React.FunctionComponent<ToolbarProps> = ({ editor, ...props }) => {
if (!editor) {
return <ToolbarContainer />;
}
const onToggleBlock = (event: React.MouseEvent, type: string): void => {
if (props.onToggleBlock) {
props.onToggleBlock(event, type);
return;
}
event.preventDefault();
const isActive = EditorHandler.hasBlock(editor.value, type);
const nextBlockType = isActive ? EditorHandler.DEFAULT_NODE : type;
editor.setBlocks(nextBlockType);
}
const onToggleMark = (event: React.MouseEvent, type: string): void => {
if (props.onToggleMark) {
props.onToggleMark(event, type);
return;
}
event.preventDefault();
editor.toggleMark(type);
};
return (
<ToolbarContainer className={props.className} style={props.style}>
{React.Children.map(props.children, child => React.cloneElement(
child as React.ReactElement<any>, {
onToggleBlock: onToggleBlock,
onToggleMark: onToggleMark,
editor,
}
))}
</ToolbarContainer>
);
}
const ToolbarContainer = styled.div`
border: 2px solid ${Colors.grayLight};
border-radius: 0.4rem;
display: flex;
overflow-x: scroll;
padding: 10px 7.5px;
margin-bottom: 15px;
`;
export default EditorToolbar;