import React from 'react'; import Clipboard from 'clipboard'; let counter = 0; class Clip extends React.Component { static propTypes: { options: React.PropTypes.object, } /* Returns a object with all props that fulfill a certain naming pattern * * @param {RegExp} regexp - Regular expression representing which pattern * you'll be searching for. * @param {Boolean} remove - Determines if the regular expression should be * removed when transmitting the key from the props * to the new object. * * e.g: * * // Considering: * // this.props = {option-foo: 1, onBar: 2, data-foobar: 3 data-baz: 4}; * * // *RegExps not using // so that this comment doesn't break up * this.propsWith(option-*, true); // returns {foo: 1} * this.propsWith(on*, true); // returns {Bar: 2} * this.propsWith(data-*); // returns {data-foobar: 1, data-baz: 4} */ propsWith(regexp, remove=false) { let object = {}; Object.keys(this.props).forEach(function(key) { if (key.search(regexp) !== -1) { let objectKey = remove ? key.replace(regexp, '') : key; object[objectKey] = this.props[key]; } }, this); return object; } constructor(props) { super(props); this.id = `__react_clipboard_${counter++}__`; } componentDidMount() { // Support old API by trying to assign this.props.options first; let options = this.props.options || this.propsWith(/^option-/, true); this.clipboard = new Clipboard(`#${this.id}`, options); let callbacks = this.propsWith(/^on/, true); Object.keys(callbacks).forEach(function(callback) { this.clipboard.on(callback.toLowerCase(), this.props['on' + callback]); }, this); } render() { let dataAttributes = this.propsWith(/^data-/); let component = this.props.component || 'span'; return React.createElement(component, { id: this.id, className: this.props.className || '', style: this.props.style || {}, ...dataAttributes }, this.props.children); } } export default Clip;