blob: 821241a5db2480bf8b89e266657b7302523656a2 [file] [log] [blame]
// Licensed under the Apache License, Version 2.0 (the 'License'); you may not
// use this file except in compliance with the License. You may obtain a copy of
// the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an 'AS IS' BASIS, WITHOUT
// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
// License for the specific language governing permissions and limitations under
// the License.
import PropTypes from 'prop-types';
import React from 'react';
import ClipboardJS from 'clipboard';
let clipboard;
// Locates the specific element on the DOM, configures the clipboard, and
// sets the callback on 'success' (usually a Fauxton notification).
export const initializeClipboard = (uniqueKey, cb) => {
clipboard = new ClipboardJS('#copy-' + uniqueKey);
clipboard.on('success', function() {
cb();
});
};
// Cleans up the fake elements left around by clipboard.js
export const destroyClipboard = () => {
clipboard.destroy();
};
export class Copy extends React.Component {
componentDidMount () {
initializeClipboard(this.props.uniqueKey, this.props.onClipboardClick);
}
componentWillUnmount () {
destroyClipboard();
}
// Necessary for copy elements that are not unmounted even though they are
// no longer visible (ex. Notification rows in the notification center).
componentDidUpdate () {
initializeClipboard(this.props.uniqueKey, this.props.onClipboardClick);
}
getClipboardElement () {
if (this.props.displayType === 'icon') {
return (<i aria-hidden="true" className="fonticon-copy"></i>);
}
return this.props.textDisplay;
}
getClipboardButton () {
const btnClasses = this.props.displayType === 'input' ? "btn copy-button" : "copy" + " clipboard-copy-element";
return (
<button
aria-label="Copy to Clipboard"
className={btnClasses}
data-clipboard-text={this.props.text}
title={this.props.title}
id={"copy-" + this.props.uniqueKey}
>
{this.getClipboardElement()}
</button>
);
}
render () {
if (this.props.displayType === 'input') {
return (
<p>
<input
type="text"
className="input-xxlarge text-field-to-copy"
readOnly
value={this.props.text} />
{this.getClipboardButton()}
</p>
);
}
return (
this.getClipboardButton()
);
}
}
Copy.defaultProps = {
displayType: 'icon',
textDisplay: 'Copy',
title: 'Copy to clipboard',
onClipboardClick: function () { }
};
Copy.propTypes = {
text: PropTypes.string.isRequired,
displayType: PropTypes.oneOf(['icon', 'text', 'input']),
uniqueKey: PropTypes.string.isRequired,
onClipboardClick: PropTypes.func.isRequired
};