terriajs
Version:
Geospatial data visualization platform.
74 lines (66 loc) • 2.22 kB
JSX
import clipboard from 'clipboard';
import React from 'react';
import Styles from './clipboard.scss';
import classNames from 'classnames';
import PropTypes from 'prop-types';
export default class Clipboard extends React.Component {
constructor(props) {
super(props);
this.state = {
tooltip: null
};
this.resetTooltipLater = this.resetTooltipLater.bind(this);
}
componentDidMount() {
this.clipboardBtn = new clipboard(`.btn-copy-${this.props.id}`);
this.clipboardBtn.on('success', _ => {
this.setState({
tooltip: "copied!"
});
this.resetTooltipLater();
});
this.clipboardBtn.on('error', _ => {
this.setState({
tooltip: "copy unsuccessful!"
});
this.resetTooltipLater();
});
}
componentWillUnmount() {
this.removeTimeout();
this.clipboardBtn.destroy();
}
removeTimeout() {
if (this._timerID !== undefined) {
window.clearTimeout(this._timerID);
this._timerID = undefined;
}
}
resetTooltipLater() {
this.removeTimeout();
this._timerID = window.setTimeout(() => {
this.setState({
tooltip: null
});
}, 3000);
}
render() {
return (
<div className={Styles.clipboard}>
<div>Share URL</div>
<div className={Styles.explanation}>Anyone visiting this URL will see this map view.</div>
<div className={Styles.clipboardBody}>
{this.props.source}
<button className={classNames(`btn-copy-${this.props.id}`, Styles.copyBtn)} data-clipboard-target={`#${this.props.id}`}>
Copy
</button>
</div>
{this.state.tooltip && <span className={Styles.tooltip}>{this.state.tooltip}</span>}
</div>
);
}
}
Clipboard.propTypes = {
id: PropTypes.string.isRequired,
source: PropTypes.object.isRequired,
};