-
-
Notifications
You must be signed in to change notification settings - Fork 871
Expand file tree
/
Copy pathBlockChooserButton.jsx
More file actions
114 lines (104 loc) · 2.8 KB
/
Copy pathBlockChooserButton.jsx
File metadata and controls
114 lines (104 loc) · 2.8 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import React from 'react';
import { doesNodeContainClick } from 'semantic-ui-react/dist/commonjs/lib';
import addSVG from '@plone/volto/icons/circle-plus.svg';
import { blockHasValue } from '@plone/volto/helpers';
import { Icon, BlockChooser } from '@plone/volto/components';
import { Button } from 'semantic-ui-react';
import { defineMessages, useIntl } from 'react-intl';
const messages = defineMessages({
addBlock: {
id: 'Add block',
defaultMessage: 'Add block',
},
});
export const ButtonComponent = (props) => {
const intl = useIntl();
const {
className = 'block-add-button',
size = '19px',
onShowBlockChooser,
} = props;
return (
<Button
icon
basic
title={intl.formatMessage(messages.addBlock)}
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
onShowBlockChooser();
}}
className={className}
>
<Icon name={addSVG} className={className} size={size} />
</Button>
);
};
const BlockChooserButton = (props) => {
const {
block,
allowedBlocks,
showRestricted,
data,
onMutateBlock,
onInsertBlock,
blocksConfig,
buttonComponent,
properties,
} = props;
const { disableNewBlocks } = data;
const [addNewBlockOpened, setAddNewBlockOpened] = React.useState(false);
const blockChooserRef = React.useRef();
const handleClickOutside = React.useCallback((e) => {
if (
blockChooserRef.current &&
doesNodeContainClick(blockChooserRef.current, e)
)
return;
setAddNewBlockOpened(false);
}, []);
const Component = buttonComponent || ButtonComponent;
React.useEffect(() => {
document.addEventListener('mousedown', handleClickOutside, false);
return () => {
document.removeEventListener('mousedown', handleClickOutside, false);
};
}, [handleClickOutside]);
return (
<>
{!disableNewBlocks && !blockHasValue(data) ? (
<Component
{...props}
onShowBlockChooser={() => setAddNewBlockOpened(true)}
/>
) : null}
{addNewBlockOpened && (
<BlockChooser
onMutateBlock={
onMutateBlock
? (id, value) => {
setAddNewBlockOpened(false);
onMutateBlock(id, value);
}
: null
}
onInsertBlock={
onInsertBlock
? (id, value) => {
setAddNewBlockOpened(false);
onInsertBlock(id, value);
}
: null
}
currentBlock={block}
allowedBlocks={allowedBlocks}
blocksConfig={blocksConfig}
properties={properties}
showRestricted={showRestricted}
ref={blockChooserRef}
/>
)}
</>
);
};
export default BlockChooserButton;