/
plugin.jsx
113 lines (103 loc) · 2.68 KB
/
plugin.jsx
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
/**
* External dependencies
*/
import tinymce from 'tinymce/tinymce';
import i18n from 'i18n-calypso';
import React, { createElement } from 'react';
import { unmountComponentAtNode } from 'react-dom';
import { renderToStaticMarkup } from 'react-dom/server';
/**
* Internal Dependencies
*/
import ContactFormDialog from './dialog';
import {
formClear,
formLoad,
fieldAdd,
fieldRemove,
fieldUpdate,
settingsUpdate,
} from 'state/ui/editor/contact-form/actions';
import { serialize, deserialize } from './shortcode-utils';
import { renderWithReduxStore } from 'lib/react-helpers';
import Gridicon from 'components/gridicon';
function wpcomContactForm( editor ) {
let node;
const store = editor.getParam( 'redux_store' );
editor.on( 'init', () => {
node = editor.getContainer().appendChild( document.createElement( 'div' ) );
} );
editor.on( 'remove', () => {
unmountComponentAtNode( node );
node.parentNode.removeChild( node );
node = null;
} );
editor.addCommand( 'wpcomContactForm', content => {
let isEdit = false;
if ( content ) {
store.dispatch( formLoad( deserialize( content ) ) );
isEdit = true;
} else {
store.dispatch( formClear() );
}
function renderModal( visibility = 'show', activeTab = 'fields' ) {
renderWithReduxStore(
createElement( ContactFormDialog, {
showDialog: visibility === 'show',
activeTab,
isEdit,
onInsert() {
const state = store.getState();
editor.execCommand(
'mceInsertContent',
false,
serialize( state.ui.editor.contactForm )
);
renderModal( 'hide' );
},
onChangeTabs( tab ) {
renderModal( 'show', tab );
},
onClose() {
store.dispatch( formClear() );
editor.focus();
renderModal( 'hide' );
},
onFieldAdd() {
store.dispatch( fieldAdd() );
},
onFieldRemove( index ) {
store.dispatch( fieldRemove( index ) );
},
onFieldUpdate( index, field ) {
store.dispatch( fieldUpdate( index, field ) );
},
onSettingsUpdate( settings ) {
store.dispatch( settingsUpdate( settings ) );
},
} ),
node,
store
);
}
renderModal();
} );
editor.addButton( 'wpcom_add_contact_form', {
classes: 'btn wpcom-icon-button contact-form',
title: i18n.translate( 'Add Contact Form' ),
cmd: 'wpcomContactForm',
onPostRender() {
this.innerHtml(
renderToStaticMarkup(
// eslint-disable-next-line jsx-a11y/no-interactive-element-to-noninteractive-role
<button type="button" role="presentation">
<Gridicon icon="mention" />
</button>
)
);
},
} );
}
export default () => {
tinymce.PluginManager.add( 'wpcom/contactform', wpcomContactForm );
};