Add create custom field handling to store

[MAILPOET-2463]
This commit is contained in:
Rostislav Wolny
2020-01-13 16:17:49 +01:00
committed by Pavel Dohnal
parent aa4e4510c0
commit e87d72b5c6
9 changed files with 115 additions and 15 deletions

View File

@ -7,7 +7,7 @@ import {
TextControl, TextControl,
} from '@wordpress/components'; } from '@wordpress/components';
import { BlockIcon } from '@wordpress/block-editor'; import { BlockIcon } from '@wordpress/block-editor';
import { useSelect } from '@wordpress/data'; import { useSelect, useDispatch } from '@wordpress/data';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import icon from './icon.jsx'; import icon from './icon.jsx';
@ -51,6 +51,8 @@ const AddCustomField = ({ clientId }) => {
const canSubmit = () => fieldName && fieldSettings; const canSubmit = () => fieldName && fieldSettings;
const { createCustomField } = useDispatch('mailpoet-form-editor');
const dateSettings = useSelect( const dateSettings = useSelect(
(sel) => sel('mailpoet-form-editor').getDateSettingsData(), (sel) => sel('mailpoet-form-editor').getDateSettingsData(),
[] []
@ -109,7 +111,7 @@ const AddCustomField = ({ clientId }) => {
icon={<BlockIcon icon={icon} showColors />} icon={<BlockIcon icon={icon} showColors />}
label="New Custom Field" label="New Custom Field"
> >
<p id={clientId}>Create a new custom field for your subscribers.</p> <p>Create a new custom field for your subscribers.</p>
<div className="mailpoet_custom_field_add_form"> <div className="mailpoet_custom_field_add_form">
<hr /> <hr />
<SelectControl <SelectControl
@ -131,15 +133,12 @@ const AddCustomField = ({ clientId }) => {
isDefault isDefault
disabled={!canSubmit()} disabled={!canSubmit()}
onClick={() => { onClick={() => {
// eslint-disable-next-line no-console
console.log('Custom field data to store');
const data = { const data = {
name: fieldName, name: fieldName,
type: fieldType, type: fieldType,
params: mapCustomFieldFormData(fieldType, fieldSettings), params: mapCustomFieldFormData(fieldType, fieldSettings),
}; };
// eslint-disable-next-line no-console createCustomField(data, clientId);
console.log(data);
}} }}
> >
{'Create'} {'Create'}

View File

@ -13,18 +13,17 @@ import * as segmentSelect from './segment_select/segment_select.jsx';
import * as html from './html/html.jsx'; import * as html from './html/html.jsx';
import * as addCustomField from './add_custom_field/add_custom_field.jsx'; import * as addCustomField from './add_custom_field/add_custom_field.jsx';
const registerCustomFieldBlock = (customField) => { export const registerCustomFieldBlock = (customField) => {
const namesMap = getCustomFieldBlocksSettings(customField); const namesMap = getCustomFieldBlocksSettings(customField);
if (!namesMap[customField.type]) return; if (!namesMap[customField.type]) return null;
registerBlockType( const blockName = formatCustomFieldBlockName(namesMap[customField.type].name, customField);
formatCustomFieldBlockName(namesMap[customField.type].name, customField), registerBlockType(blockName, namesMap[customField.type].settings);
namesMap[customField.type].settings return blockName;
);
}; };
export default () => { export const initBlocks = () => {
const customFields = select('mailpoet-form-editor').getAllAvailableCustomFields(); const customFields = select('mailpoet-form-editor').getAllAvailableCustomFields();
const categories = [ const categories = [

View File

@ -4,7 +4,7 @@ import { GlobalContext, useGlobalContextValue } from 'context/index.jsx';
import Notices from 'notices/notices.jsx'; import Notices from 'notices/notices.jsx';
import Editor from './components/editor.jsx'; import Editor from './components/editor.jsx';
import initStore from './store/store.jsx'; import initStore from './store/store.jsx';
import initBlocks from './blocks/blocks.jsx'; import { initBlocks } from './blocks/blocks.jsx';
const App = () => ( const App = () => (
<GlobalContext.Provider value={useGlobalContextValue(window)}> <GlobalContext.Provider value={useGlobalContextValue(window)}>

View File

@ -68,6 +68,26 @@ export function saveCustomFieldFailed(message = undefined) {
}; };
} }
export function createCustomFieldDone(response) {
return {
type: 'CREATE_CUSTOM_FIELD_DONE',
response,
};
}
export function createCustomFieldStarted() {
return {
type: 'CREATE_CUSTOM_FIELD_STARTED',
};
}
export function createCustomFieldFailed(message = undefined) {
return {
type: 'CREATE_CUSTOM_FIELD_FAILED',
message,
};
}
export function changeFormSettings(settings) { export function changeFormSettings(settings) {
return { return {
type: 'CHANGE_FORM_SETTINGS', type: 'CHANGE_FORM_SETTINGS',
@ -136,6 +156,14 @@ export function* saveCustomField(data) {
}; };
} }
export function* createCustomField(data, clientId) {
yield {
type: 'CREATE_CUSTOM_FIELD',
clientId,
data,
};
}
export function* deleteCustomField(customFieldId, clientId) { export function* deleteCustomField(customFieldId, clientId) {
yield { yield {
type: 'DELETE_CUSTOM_FIELD', type: 'DELETE_CUSTOM_FIELD',

View File

@ -1,10 +1,11 @@
import { select, dispatch } from '@wordpress/data'; import { select, dispatch } from '@wordpress/data';
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import { merge } from 'lodash'; import { merge } from 'lodash';
import { unregisterBlockType, createBlock } from '@wordpress/blocks'; import { createBlock, unregisterBlockType } from '@wordpress/blocks';
import blocksToFormBody from './blocks_to_form_body.jsx'; import blocksToFormBody from './blocks_to_form_body.jsx';
import formatCustomFieldBlockName from '../blocks/format_custom_field_block_name.jsx'; import formatCustomFieldBlockName from '../blocks/format_custom_field_block_name.jsx';
import getCustomFieldBlockSettings from '../blocks/custom_fields_blocks.jsx'; import getCustomFieldBlockSettings from '../blocks/custom_fields_blocks.jsx';
import { registerCustomFieldBlock } from '../blocks/blocks.jsx';
export default { export default {
SAVE_FORM() { SAVE_FORM() {
@ -65,6 +66,30 @@ export default {
}); });
}, },
CREATE_CUSTOM_FIELD(action) {
dispatch('mailpoet-form-editor').createCustomFieldStarted();
MailPoet.Ajax.post({
api_version: window.mailpoet_api_version,
endpoint: 'customFields',
action: 'save',
data: action.data,
})
.then((response) => {
const customField = response.data;
const blockName = registerCustomFieldBlock(customField);
const customFieldBlock = createBlock(blockName);
dispatch('core/block-editor').replaceBlock(action.clientId, customFieldBlock);
dispatch('mailpoet-form-editor').createCustomFieldDone(response.data);
})
.fail((response) => {
let errorMessage = null;
if (response.errors.length > 0) {
errorMessage = response.errors.map((error) => (error.message));
}
dispatch('mailpoet-form-editor').createCustomFieldFailed(errorMessage);
});
},
DELETE_CUSTOM_FIELD(actionData) { DELETE_CUSTOM_FIELD(actionData) {
dispatch('mailpoet-form-editor').deleteCustomFieldStarted(); dispatch('mailpoet-form-editor').deleteCustomFieldStarted();
const customFields = select('mailpoet-form-editor').getAllAvailableCustomFields(); const customFields = select('mailpoet-form-editor').getAllAvailableCustomFields();

View File

@ -1,4 +1,7 @@
import MailPoet from 'mailpoet'; import MailPoet from 'mailpoet';
import createCustomFieldDone from './reducers/create_custom_field_done.jsx';
import createCustomFieldFailed from './reducers/create_custom_field_failed.jsx';
import createCustomFieldStarted from './reducers/create_custom_field_started.jsx';
import changeFormName from './reducers/change_form_name.jsx'; import changeFormName from './reducers/change_form_name.jsx';
import changeFormSettings from './reducers/change_form_settings.jsx'; import changeFormSettings from './reducers/change_form_settings.jsx';
import changeFormStyles from './reducers/change_form_styles.jsx'; import changeFormStyles from './reducers/change_form_styles.jsx';
@ -23,6 +26,9 @@ const saveFormStarted = saveFormStartedFactory(MailPoet);
export default (defaultState) => (state = defaultState, action) => { export default (defaultState) => (state = defaultState, action) => {
switch (action.type) { switch (action.type) {
case 'CREATE_CUSTOM_FIELD_DONE': return createCustomFieldDone(state, action);
case 'CREATE_CUSTOM_FIELD_FAILED': return createCustomFieldFailed(state, action);
case 'CREATE_CUSTOM_FIELD_STARTED': return createCustomFieldStarted(state, action);
case 'CHANGE_FORM_BLOCKS': return changeFormBlocks(state, action); case 'CHANGE_FORM_BLOCKS': return changeFormBlocks(state, action);
case 'CHANGE_FORM_NAME': return changeFormName(state, action); case 'CHANGE_FORM_NAME': return changeFormName(state, action);
case 'CHANGE_FORM_SETTINGS': return changeFormSettings(state, action); case 'CHANGE_FORM_SETTINGS': return changeFormSettings(state, action);

View File

@ -0,0 +1,21 @@
import MailPoet from 'mailpoet';
export default (state, action) => {
const notices = state.notices.filter((notice) => notice.id !== 'custom-field');
notices.push({
id: 'custom-field',
content: MailPoet.I18n.t('customFieldSaved'),
isDismissible: true,
status: 'success',
});
const customFields = [...state.customFields];
customFields.push(action.response);
return {
...state,
isCustomFieldCreating: false,
notices,
customFields,
};
};

View File

@ -0,0 +1,14 @@
export default (state, action) => {
const notices = state.notices.filter((notice) => notice.id !== 'custom-field');
notices.push({
id: 'custom-field',
content: action.message,
isDismissible: true,
status: 'error',
});
return {
...state,
isCustomFieldCreating: false,
notices,
};
};

View File

@ -0,0 +1,8 @@
export default (state) => {
const notices = state.notices.filter((notice) => notice.id !== 'custom-field');
return {
...state,
isCustomFieldCreating: true,
notices,
};
};