PluginProbe ʕ •ᴥ•ʔ
VK Blocks / trunk
VK Blocks vtrunk
1.123.0 1.122.0 1.121.0 1.120.0 1.119.2 1.119.1 1.119.0 1.118.7 1.82.0.0 1.82.0.1 1.83.0.0 1.83.0.1 1.84.0.0 1.84.0.1 1.85.0.2 1.85.0.3 1.85.1.0 1.85.1.1 1.86.0.0 1.86.0.1 1.86.1.0 1.87.0.0 1.87.0.1 1.88.0.1 1.88.0.2 1.89.0.0 1.9.2 1.90.0.0 1.90.0.1 1.90.1.1 1.91.0.0 1.91.1.1 1.92.0.0 1.92.0.1 1.92.1.0 1.92.1.1 1.93.0.0 trunk 1.93.0.1 0.1.1 1.93.1.0 0.10.3 1.93.1.1 0.11.0 1.94.0.0 0.12.6 1.94.0.1 0.15.1 1.94.1.0 0.16.2 1.94.2.1 0.17.6 1.94.2.2 0.2.2 1.95.0.3 0.22.4 1.95.0.4 0.26.7 1.96.2.0 0.3.2 1.96.2.1 0.31.0 1.97.0.1 0.35.5 1.97.0.2 0.37.5 1.99.0.0 0.38.8 1.99.0.1 0.39.4 0.4.7 0.41.0 0.42.0 0.44.13 0.45.2 0.46.1 0.47.0 0.48.0 0.49.8 0.5.2 0.50.3 0.51.0 0.52.2 0.53.2 0.54.0 0.55.0 0.56.2 0.56.3 0.57.6 0.58.10 0.59.0 0.6.0 0.60.1 0.61.2 0.7.1 0.8.2 1.0.16 1.10.0 1.100.0.0 1.100.0.1 1.102.0.0 1.102.0.1 1.103.0.0 1.104.0.0 1.104.0.1 1.105.1.0 1.105.1.1 1.106.0.0 1.106.0.1 1.107.0.0 1.107.0.1 1.107.0.2 1.108.0.0 1.108.0.1 1.109.0.0 1.109.0.1 1.11.4 1.110.0.0 1.110.0.1 1.111.0.0 1.111.0.1 1.111.0.2 1.112.0.0 1.112.0.1 1.113.0.0 1.113.0.1 1.114.0.0 1.114.0.1 1.114.2.0 1.114.2.1 1.115.0.0 1.115.0.1 1.115.1.0 1.115.1.1 1.115.2.0 1.115.2.1 1.116.0.0 1.116.0.1 1.116.1.0 1.116.1.1 1.116.2.0 1.117.0.0 1.117.0.1 1.117.1.0 1.118.2 1.118.5 1.12.0 1.13.2 1.14.1 1.15.1 1.16.11 1.17.0 1.18.6 1.19.0 1.19.1 1.2.3 1.20.7 1.21.0 1.22.4 1.23.0 1.24.5 1.25.1 1.26.2 1.27.7.2 1.28.0.1 1.29.2.0 1.3.9 1.30.0.1 1.31.0.1 1.32.0.2 1.33.2.1 1.36.1.5 1.37.0.0 1.39.2.1 1.4.6 1.40.0.1 1.40.1.0 1.40.1.1 1.41.0.0 1.41.0.1 1.41.2.2 1.41.2.3 1.43.0.0 1.43.0.1 1.43.0.2 1.44.0.0 1.44.0.1 1.45.0.0 1.45.0.1 1.46.0.0 1.46.0.1 1.47.0.0 1.47.0.1 1.47.1.0 1.48.0.0 1.48.0.1 1.48.0.2 1.48.1.0 1.48.1.1 1.5.0 1.50.0.0 1.50.0.1 1.51.0.0 1.51.0.1 1.52.0.0 1.52.0.1 1.53.0.0 1.53.0.1 1.54.0.0 1.54.0.1 1.55.0.0 1.55.0.1 1.56.0.0 1.56.0.1 1.57.0.0 1.57.0.2 1.57.0.3 1.57.0.4 1.57.0.5 1.57.1.0 1.57.1.1 1.57.1.2 1.58.0.0 1.58.0.1 1.59.0.0 1.59.0.1 1.6.0 1.60.0.0 1.60.0.1 1.63.0.0 1.63.0.1 1.64.0.0 1.64.0.1 1.64.1.0 1.64.1.2 1.67.0.0 1.67.0.1 1.68.0.0 1.68.0.1 1.69.0.0 1.69.0.1 1.69.1.1 1.69.1.2 1.7.1 1.70.0.0 1.70.0.1 1.71.0.0 1.71.0.1 1.72.0.0 1.72.1.0 1.72.1.1 1.73.0.0 1.73.0.1 1.74.0.0 1.74.0.1 1.75.0.0 1.75.1.0 1.75.1.1 1.76.0.0 1.76.0.1 1.76.1.0 1.76.1.1 1.76.2.0 1.76.2.1 1.77.0.0 1.77.0.1 1.78.0.0 1.78.0.1 1.79.0.0 1.79.0.1 1.79.0.2 1.79.0.3 1.79.1.0 1.79.1.1 1.8.2 1.80.1.0 1.80.1.1 1.80.1.2 1.81.0.1 1.81.0.2
vk-blocks / src / extensions / common / custom-block-variation / create-variation / index.js
vk-blocks / src / extensions / common / custom-block-variation / create-variation Last commit date
block-variation-form 2 months ago index.js 2 months ago
index.js
145 lines
1 /**
2 * WordPress dependencies
3 */
4 import { __ } from '@wordpress/i18n';
5 import { store as blockEditorStore } from '@wordpress/block-editor';
6 import { useState, useEffect } from '@wordpress/element';
7 import { registerBlockVariation } from '@wordpress/blocks';
8 import { useSelect } from '@wordpress/data';
9
10 /**
11 * Internal dependencies
12 */
13 import VariationForm from './block-variation-form';
14 import { VariationIcon } from '../icons';
15 import { SaveButton } from '../save-button';
16 import { STORE_NAME } from '@vkblocks/utils/store/constants';
17
18 const DEFAULT_VARIATION = {
19 name: '',
20 title: '',
21 description: '',
22 category: '',
23 icon: '',
24 scope: [],
25 keywords: '',
26 };
27
28 export default function CreateVariation(props) {
29 const { blockName, clientId, setIsModalOpen, setHasUpdates } = props;
30 const [variation, setVariation] = useState(DEFAULT_VARIATION);
31 const [canSave, setCanSave] = useState(false);
32
33 const [variationState, setVariationState] = useState();
34
35 const { optionObj } = useSelect((select) => {
36 const { getOptions } = select(STORE_NAME);
37 return {
38 optionObj: getOptions(),
39 };
40 }, []);
41 const blockVariationLists =
42 optionObj?.vkBlocksOption?.block_variation_lists;
43 useEffect(() => {
44 setVariationState(blockVariationLists);
45 }, [blockVariationLists]);
46
47 useEffect(() => {
48 if (JSON.stringify(variation) === JSON.stringify(DEFAULT_VARIATION)) {
49 setHasUpdates(false);
50 } else {
51 setHasUpdates(true);
52 }
53 }, [variation]);
54
55 const { getBlocksByClientId } = useSelect(
56 (select) => select(blockEditorStore),
57 []
58 );
59 const blockObj = getBlocksByClientId(clientId)[0] ?? {};
60
61 const updateSettings = (newVariation) => {
62 variationState.push({
63 block_name: blockName,
64 ...newVariation,
65 });
66 setVariationState([...variationState]);
67 };
68
69 const saveAttributes = generateAttributes(blockObj.attributes, ['url']);
70 const saveInnerBlocks = generateInnerBlocks(blockObj.innerBlocks);
71 const saveButtonClick = () => {
72 const updateVariation = {
73 ...variation,
74 attributes: JSON.stringify(saveAttributes),
75 innerBlocks: JSON.stringify(saveInnerBlocks),
76 };
77 updateSettings(updateVariation);
78 const blockVariation = {
79 ...updateVariation,
80 attributes: saveAttributes,
81 innerBlocks: saveInnerBlocks,
82 icon: variation.icon || VariationIcon,
83 block_name: undefined,
84 };
85 registerBlockVariation(blockName, blockVariation);
86
87 setIsModalOpen(false);
88 };
89 return (
90 <>
91 <VariationForm
92 variation={variation}
93 setVariation={setVariation}
94 blockName={blockName}
95 canSave={canSave}
96 setCanSave={setCanSave}
97 variationState={variationState}
98 setVariationState={setVariationState}
99 />
100 <SaveButton
101 disabled={
102 !canSave || !variation.title || variation.scope.length === 0
103 }
104 onClick={saveButtonClick}
105 variationState={variationState}
106 setVariationState={setVariationState}
107 saveButtonChildren={__('Add', 'vk-blocks')}
108 />
109 </>
110 );
111 }
112
113 function generateAttributes(attributes, excludeAttributes = []) {
114 const generatedAttributes = {};
115
116 for (const key in attributes) {
117 if (
118 excludeAttributes.find((attribute) => {
119 return attribute === key;
120 }) === undefined
121 ) {
122 if (
123 typeof attributes[key] === 'object' &&
124 !Array.isArray(attributes[key])
125 ) {
126 generatedAttributes[key] = generateAttributes(attributes[key]);
127 } else {
128 generatedAttributes[key] = attributes[key];
129 }
130 }
131 }
132
133 return generatedAttributes;
134 }
135
136 function generateInnerBlocks(propsInnerBlocks = []) {
137 return propsInnerBlocks.map(
138 ({ name, attributes = {}, innerBlocks = [] }) => [
139 name,
140 attributes,
141 generateInnerBlocks(innerBlocks),
142 ]
143 );
144 }
145