const { Component } = wp.element;
const { applyFilters } = wp.hooks;

import getCurrentUserData from './../data-providers/currentUserData';

/**
 * A wrapper that contains user data for making decisions when rendering block setting controls.
 */
export default class RenderSettingControl extends Component {
	render() {
		if ( 'undefined' === typeof this.props.children ) {
			return null;
		}

		/**
		 * Let the temporary hacks begin.
		 * Get the block name this setting is associated with.
		 */
		let fallback = false;

		if (
			'undefined' === typeof this.props.children.props ||
			'undefined' === typeof this.props.children.props.name
		) {
			fallback = true;
		}

		if (
			fallback &&
			( 'undefined' === typeof this.props.children._owner ||
				'undefined' ===
					typeof this.props.children._owner.memoizedProps ||
				'undefined' ===
					typeof this.props.children._owner.memoizedProps.name )
		) {
			return this.props.children;
		}

		const blockName = fallback
			? this.props.children._owner.memoizedProps.name
			: this.props.children.props.name;

		/**
		 * A filter for determining whether or not a setting should be rendered.
		 *
		 * @param {boolean} Whether or not the setting control should be rendered. Default true.
		 * @param {string}  The     block name.
		 * @param {string}  The     setting control's ID.
		 * @param {Object}  The     current user's data.
		 */
		if (
			applyFilters(
				'gb_should_render_block_setting',
				true,
				blockName,
				this.props.id,
				getCurrentUserData()
			)
		) {
			return this.props.children;
		}

		return null;
	}
}
