import React from 'react';
import { createBlock } from '@wordpress/blocks';
import { compose } from '@wordpress/compose';
import { withSelect, withDispatch } from '@wordpress/data';
import { PluginBlockSettingsMenuItem } from '@wordpress/edit-post';
import { __ } from '@wordpress/i18n';
import { registerPlugin } from '@wordpress/plugins';
import Logo from '../../components/Logo/Logo';
import allowedBlockTypes from '../../core/allowedBlockTypes';
type ConvertButtonProps = {
blockAttributes: any;
selectedBlock: any;
convertToTest: any;
canConvert: boolean;
}
const ConvertButton = ({
blockAttributes,
convertToTest,
selectedBlock,
canConvert,
}: ConvertButtonProps): JSX.Element | null => {
if (!canConvert) return null;
return (
}
label={__('Convert to A/B test', 'ab-testing-for-wp')}
onClick={(): void => {
// eslint-disable-next-line no-alert
const isConfirmed = window.confirm(
__('Are you sure you want to convert this block to an A/B test?', 'ab-testing-for-wp'),
);
if (!isConfirmed) return;
convertToTest(selectedBlock, blockAttributes);
}}
/>
);
};
function doesNotContainTarget(
getBlocks: (id: string) => { name: string; clientId: string }[],
id: string,
target: string,
): boolean {
const children = getBlocks(id);
return children.every((c) => {
if (c.clientId === target) {
return false;
}
return doesNotContainTarget(getBlocks, c.clientId, target);
});
}
function getCanConvert(
getBlocks: (id: string) => { name: string; clientId: string }[],
id: string,
disallowed: string[],
target: string,
): boolean {
const children = getBlocks(id);
return children.every((c) => {
if (disallowed.indexOf(c.name) > -1) {
return doesNotContainTarget(getBlocks, c.clientId, target);
}
return getCanConvert(getBlocks, c.clientId, disallowed, target);
});
}
const enhancedConvertButton = compose(
withSelect((select) => {
const editor = select('core/block-editor');
const disallowed = [
'ab-testing-for-wp/ab-test-block',
'ab-testing-for-wp/ab-test-block-variant',
];
const selectedBlock = editor.getSelectedBlock();
const id = selectedBlock ? selectedBlock.clientId : '';
const root = editor.getBlockHierarchyRootClientId(id);
const blockAttributes = editor.getBlockAttributes(id);
return {
blockAttributes,
canConvert: getCanConvert(editor.getBlocks, root, disallowed, id),
selectedBlock,
};
}),
withDispatch((dispatch) => {
const { replaceBlock } = dispatch('core/block-editor');
return {
convertToTest(original: any, blockAttributes: any): void {
const container = createBlock(
'ab-testing-for-wp/ab-test-block',
{
defaultContent: {
block: original,
attributes: blockAttributes,
},
},
);
replaceBlock(
original.clientId,
container,
);
},
};
}),
)(ConvertButton);
const Icon: React.FC = () =>
;
registerPlugin('block-settings-menu-ab-test-convert', { icon: Icon, render: enhancedConvertButton });