import {isElement, isField, isGroup, Node} from '@givewp/forms/types';
import FieldNode from './FieldNode';
import ElementNode from './ElementNode';
import GroupNode from './GroupNode';
import GatewayFieldNode from '@givewp/forms/app/fields/GatewayFieldNode';
import {elementTemplateExists, fieldTemplateExists, groupTemplateExists} from '@givewp/forms/app/templates';
import useVisibilityCondition from '@givewp/forms/app/hooks/useVisibilityCondition';
import {useEffect} from '@wordpress/element';
import memoNode from '@givewp/forms/app/utilities/memoNode';
const formTemplates = window.givewp.form.templates;
/**
* Determine which node template to render and apply visibility conditions. It is important the visibility conditions
* occur here, instead of in the more specific components, as it prevents the subsequent hooks from firing, which can
* cause an infinite re-render loop.
*
* @since 3.0.0
*/
function SectionNode({node}: {node: Node}) {
const showNode = useVisibilityCondition(node.visibilityConditions);
const {unregister} = window.givewp.form.hooks.useFormContext();
useEffect(() => {
if (showNode) {
return;
}
if (isField(node)) {
unregister(node.name, {
keepDefaultValue: true,
});
}
if (isGroup(node)) {
node.walkNodes((node) => {
unregister(node.name, {
keepDefaultValue: true,
});
}, isField);
}
}, [showNode, unregister]);
if (!showNode) {
return null;
}
if (isField(node) && fieldTemplateExists(node)) {
if (node.type === 'gateways') {
return ;
}
return ;
} else if (isElement(node) && elementTemplateExists(node)) {
return ;
} else if (isGroup(node) && groupTemplateExists(node)) {
return ;
} else {
console.error(`Node: ${JSON.stringify(node)} does not exist in Form Design: ${JSON.stringify(formTemplates)}`);
return null;
}
}
const MemoizedSectionNode = memoNode(SectionNode);
export default MemoizedSectionNode;