elements_Button_BrandedButton_index.js

import { React, classnames, PropTypes } from '@gravityforms/libraries';
import { spacerClasses } from '@gravityforms/utils';

const { forwardRef } = React;

/**
 * @module BrandedButton
 * @description A branded button component.
 *
 * @since 4.3.1
 *
 * @param {object}                     props                  Component props.
 * @param {object}                     props.customAttributes Custom attributes for the component.
 * @param {string|Array|object}        props.customClasses    Custom classes for the component.
 * @param {boolean}                    props.disabled         Whether the button is disabled or not.
 * @param {string}                     props.label            The label for the button.
 * @param {Function}                   props.onClick          On click handler for the button.
 * @param {string|number|Array|object} props.spacing          The spacing for the component, as a string, number, array, or object.
 * @param {JSX.Element|null}           props.Svg              Svg element for the brand.
 * @param {string}                     props.type             The button type.
 *
 * @return {JSX.Element} The branded button component.
 *
 * @example
 * import BrandedButton from '@gravityforms/components/react/admin/elements/Button/BrandedButton';
 *
 * return (
 *     <BrandedButton onClick={ () => {} } type="white" Svg={ <Svg /> } label={ 'Click me' } />
 * );
 *
 */
const BrandedButton = forwardRef( ( {
	customAttributes = {},
	customClasses = [],
	disabled = false,
	label = '',
	onClick = () => {},
	spacing = '',
	Svg = null,
	type = 'color',
}, ref ) => {
	const attributes = {
		className: classnames( {
			'gform-branded-button': true,
			[ `gform-branded-button--${ type }` ]: true,
			...spacerClasses( spacing ),
		}, customClasses ),
		disabled,
		onClick,
		...customAttributes,
	};

	return (
		<button { ...attributes } ref={ ref }>
			{ Svg && <span className="gform-branded-button__svg">{ Svg }</span> }
			{ label && <span className="gform-branded-button__text">{ label }</span> }
		</button>
	);
} );

BrandedButton.propTypes = {
	customAttributes: PropTypes.object,
	customClasses: PropTypes.oneOfType( [
		PropTypes.string,
		PropTypes.array,
		PropTypes.object,
	] ),
	disabled: PropTypes.bool,
	label: PropTypes.string,
	onClick: PropTypes.func,
	spacing: PropTypes.oneOfType( [
		PropTypes.string,
		PropTypes.number,
		PropTypes.array,
		PropTypes.object,
	] ),
	Svg: PropTypes.node,
	type: PropTypes.string,
};

BrandedButton.displayName = 'Elements/Button/BrandedButton';

export default BrandedButton;