-
Notifications
You must be signed in to change notification settings - Fork 894
/
classicEditor.js
107 lines (97 loc) · 2.61 KB
/
classicEditor.js
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
import { render, Component, createRef } from "@wordpress/element";
import { SlotFillProvider } from "@wordpress/components";
import MetaboxPortal from "../components/MetaboxPortal";
import getL10nObject from "../analysis/getL10nObject";
const registeredComponents = [];
let containerRef = null;
class RegisteredComponentsContainer extends Component {
/**
* Constructs a container for registered components.
*
* @param {Object} props Props for this component.
*/
constructor( props ) {
super( props );
this.state = {
registeredComponents: [],
};
}
/**
* Registers a react component to be rendered within the metabox slot-fill
* provider.
*
* @param {string} key Unique key to give to React to render
* within a list of components.
* @param {React.Component} Component A valid React component to render.
*
* @returns {void}
*/
registerComponent( key, Component ) {
this.setState( {
registeredComponents: [
...this.state.registeredComponents,
{
key,
Component,
},
],
} );
}
/**
* Renders all the registered components.
*
* @returns {React.Element[]} The rendered components in an array.
*/
render() {
return this.state.registeredComponents.map( ( { Component, key } ) => {
return <Component key={ key } />;
} );
}
}
/**
* Renders a React tree for the classic editor.
*
* @param {Object} store The active redux store.
*
* @returns {void}
*/
export function renderClassicEditorMetabox( store ) {
const localizedData = getL10nObject();
containerRef = createRef();
const theme = {
isRtl: localizedData.isRtl,
};
render(
(
<SlotFillProvider>
<MetaboxPortal
target="wpseo-metabox-root"
store={ store }
theme={ theme }
/>
<RegisteredComponentsContainer ref={ containerRef } />
</SlotFillProvider>
),
document.getElementById( "wpseo-metabox-root" )
);
registeredComponents.forEach( ( registered ) => {
containerRef.current.registerComponent( registered.key, registered.Component );
} );
}
/**
* Registers a react component to be rendered within the metabox slot-fill
* provider.
*
* @param {string} key Unique key to give to React to render
* within a list of components.
* @param {React.Component} Component A valid React component to render.
*
* @returns {void}
*/
export function registerReactComponent( key, Component ) {
if ( containerRef === null || containerRef.current === null ) {
registeredComponents.push( { key, Component } );
} else {
containerRef.current.registerComponent( key, Component );
}
}