@gravityforms/components
Version:
UI components for use in Gravity Forms development. Both React and vanilla js flavors.
130 lines (121 loc) • 3.88 kB
JavaScript
import { React, classnames, PropTypes } from '@gravityforms/libraries';
import { clipboard } from '@gravityforms/utils';
import Button from '../index';
const { forwardRef } = React;
/**
* @module CopyButton
* @description A copy button component.
*
* @since 5.6.0
*
* @param {object} props Component props.
* @param {JSX.Element|null} props.children React element children.
* @param {string} props.copyText The text to copy to the clipboard when the button is clicked.
* @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.icon Icon name if using an icon button.
* @param {object} props.iconAttributes Custom attributes for the icon.
* @param {string} props.iconPrefix The prefix for the icon library to be used.
* @param {number} props.iconSize The icon size, in px, when type is flexible.
* @param {string} props.label The button label.
* @param {Function} props.onClick On click handler for the button.
* @param {string} props.size The button size.
* @param {string|number|Array|object} props.spacing The spacing for the component, as a string, number, array, or object.
* @param {string} props.type The button type.
*
* @return {JSX.Element} The copy button component.
*
* @example
* import CopyButton from '@gravityforms/components/react/admin/elements/Button/CopyButton';
*
* return (
* <CopyButton onClick={ () => {} } type="white" label={ 'Click me' } />
* );
*
*/
const CopyButton = forwardRef( ( {
children = null,
copyText = '',
customAttributes = {},
customClasses = [],
disabled = false,
icon = 'copy-alt',
iconAttributes = {},
iconPrefix = 'gravity-component-icon',
iconSize = 0,
label = '',
onClick = () => {},
size = 'size-height-s',
spacing = '',
type = 'icon-grey',
}, ref ) => {
const buttonProps = {
customClasses: classnames( {
'gform-copy-button': true,
'gform-copy-button--flexible': type === 'flexible',
}, customClasses ),
disabled,
icon,
iconAttributes: {
customAttributes: {
...( iconAttributes?.customAttributes || {} ),
style: {
...( iconAttributes?.customAttributes?.style || {} ),
fontSize: type === 'flexible' && iconSize ? `${ iconSize }px` : undefined,
},
},
...iconAttributes,
},
iconPrefix,
label,
onClick: ( event ) => {
if ( disabled ) {
return;
}
if ( copyText ) {
clipboard( copyText );
}
onClick( event );
},
spacing,
size,
type: type !== 'flexible' ? type : 'icon-grey',
...customAttributes,
};
return (
<Button { ...buttonProps } ref={ ref }>
{ children }
</Button>
);
} );
CopyButton.propTypes = {
children: PropTypes.oneOfType( [
PropTypes.string,
PropTypes.node,
] ),
copyText: PropTypes.string,
customAttributes: PropTypes.object,
customClasses: PropTypes.oneOfType( [
PropTypes.string,
PropTypes.array,
PropTypes.object,
] ),
disabled: PropTypes.bool,
icon: PropTypes.string,
iconAttributes: PropTypes.object,
iconPrefix: PropTypes.string,
iconSize: PropTypes.number,
label: PropTypes.string,
onClick: PropTypes.func,
size: PropTypes.string,
spacing: PropTypes.oneOfType( [
PropTypes.string,
PropTypes.number,
PropTypes.array,
PropTypes.object,
] ),
type: PropTypes.string,
};
CopyButton.displayName = 'Elements/Button/CopyButton';
export default CopyButton;