UNPKG

2.65 kBJavaScriptView Raw
1/**
2 * External dependencies
3 */
4import memize from 'memize';
5import { size, map, without } from 'lodash';
6
7/**
8 * WordPress dependencies
9 */
10import { withSelect } from '@wordpress/data';
11import { EditorProvider, ErrorBoundary, PostLockedModal } from '@wordpress/editor';
12import { StrictMode, Component } from '@wordpress/element';
13import { KeyboardShortcuts } from '@wordpress/components';
14
15/**
16 * Internal dependencies
17 */
18import preventEventDiscovery from './prevent-event-discovery';
19import Layout from './components/layout';
20
21class Editor extends Component {
22 constructor() {
23 super( ...arguments );
24
25 this.getEditorSettings = memize( this.getEditorSettings, {
26 maxSize: 1,
27 } );
28 }
29
30 getEditorSettings(
31 settings,
32 hasFixedToolbar,
33 focusMode,
34 hiddenBlockTypes,
35 blockTypes,
36 ) {
37 settings = {
38 ...settings,
39 hasFixedToolbar,
40 focusMode,
41 };
42
43 // Omit hidden block types if exists and non-empty.
44 if ( size( hiddenBlockTypes ) > 0 ) {
45 // Defer to passed setting for `allowedBlockTypes` if provided as
46 // anything other than `true` (where `true` is equivalent to allow
47 // all block types).
48 const defaultAllowedBlockTypes = (
49 true === settings.allowedBlockTypes ?
50 map( blockTypes, 'name' ) :
51 ( settings.allowedBlockTypes || [] )
52 );
53
54 settings.allowedBlockTypes = without(
55 defaultAllowedBlockTypes,
56 ...hiddenBlockTypes,
57 );
58 }
59
60 return settings;
61 }
62
63 render() {
64 const {
65 settings,
66 hasFixedToolbar,
67 focusMode,
68 post,
69 initialEdits,
70 onError,
71 hiddenBlockTypes,
72 blockTypes,
73 ...props
74 } = this.props;
75
76 if ( ! post ) {
77 return null;
78 }
79
80 const editorSettings = this.getEditorSettings(
81 settings,
82 hasFixedToolbar,
83 focusMode,
84 hiddenBlockTypes,
85 blockTypes,
86 );
87
88 return (
89 <StrictMode>
90 <EditorProvider
91 settings={ editorSettings }
92 post={ post }
93 initialEdits={ initialEdits }
94 { ...props }
95 >
96 <ErrorBoundary onError={ onError }>
97 <Layout />
98 <KeyboardShortcuts shortcuts={ preventEventDiscovery } />
99 </ErrorBoundary>
100 <PostLockedModal />
101 </EditorProvider>
102 </StrictMode>
103 );
104 }
105}
106
107export default withSelect( ( select, { postId, postType } ) => {
108 const { isFeatureActive, getPreference } = select( 'core/edit-post' );
109 const { getEntityRecord } = select( 'core' );
110 const { getBlockTypes } = select( 'core/blocks' );
111
112 return {
113 hasFixedToolbar: isFeatureActive( 'fixedToolbar' ),
114 focusMode: isFeatureActive( 'focusMode' ),
115 post: getEntityRecord( 'postType', postType, postId ),
116 hiddenBlockTypes: getPreference( 'hiddenBlockTypes' ),
117 blockTypes: getBlockTypes(),
118 };
119} )( Editor );