|
|
|
const Component = require('react').Component
|
|
|
|
const PropTypes = require('prop-types')
|
|
|
|
const h = require('react-hyperscript')
|
|
|
|
const inherits = require('util').inherits
|
|
|
|
const copyToClipboard = require('copy-to-clipboard')
|
|
|
|
const connect = require('react-redux').connect
|
|
|
|
|
|
|
|
const Tooltip = require('./tooltip')
|
|
|
|
|
|
|
|
CopyButton.contextTypes = {
|
|
|
|
t: PropTypes.func,
|
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = connect()(CopyButton)
|
|
|
|
|
|
|
|
|
|
|
|
inherits(CopyButton, Component)
|
|
|
|
function CopyButton () {
|
|
|
|
Component.call(this)
|
|
|
|
}
|
|
|
|
|
|
|
|
// As parameters, accepts:
|
|
|
|
// "value", which is the value to copy (mandatory)
|
|
|
|
// "title", which is the text to show on hover (optional, defaults to 'Copy')
|
|
|
|
CopyButton.prototype.render = function () {
|
|
|
|
const props = this.props
|
|
|
|
const state = this.state || {}
|
|
|
|
|
|
|
|
const value = props.value
|
|
|
|
const copied = state.copied
|
|
|
|
|
|
|
|
const message = copied ? this.context.t('copiedButton') : props.title || this.context.t('copyButton')
|
|
|
|
|
|
|
|
return h('.copy-button', {
|
|
|
|
style: {
|
|
|
|
display: 'flex',
|
|
|
|
alignItems: 'center',
|
|
|
|
},
|
|
|
|
}, [
|
|
|
|
|
|
|
|
h(Tooltip, {
|
|
|
|
title: message,
|
|
|
|
}, [
|
|
|
|
h('i.fa.fa-clipboard.cursor-pointer.color-orange', {
|
|
|
|
style: {
|
|
|
|
margin: '5px',
|
|
|
|
},
|
|
|
|
onClick: (event) => {
|
|
|
|
event.preventDefault()
|
|
|
|
event.stopPropagation()
|
|
|
|
copyToClipboard(value)
|
|
|
|
this.debounceRestore()
|
|
|
|
},
|
|
|
|
}),
|
|
|
|
]),
|
|
|
|
|
|
|
|
])
|
|
|
|
}
|
|
|
|
|
|
|
|
CopyButton.prototype.debounceRestore = function () {
|
|
|
|
this.setState({ copied: true })
|
|
|
|
clearTimeout(this.timeout)
|
|
|
|
this.timeout = setTimeout(() => {
|
|
|
|
this.setState({ copied: false })
|
|
|
|
}, 850)
|
|
|
|
}
|