48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
import select from 'select';
|
|
import command from '../common/command';
|
|
import createFakeElement from '../common/create-fake-element';
|
|
|
|
/**
|
|
* Create fake copy action wrapper using a fake element.
|
|
* @param {String} target
|
|
* @param {Object} options
|
|
* @return {String}
|
|
*/
|
|
const fakeCopyAction = (value, options) => {
|
|
const fakeElement = createFakeElement(value);
|
|
options.container.appendChild(fakeElement);
|
|
const selectedText = select(fakeElement);
|
|
command('copy');
|
|
fakeElement.remove();
|
|
|
|
return selectedText;
|
|
};
|
|
|
|
/**
|
|
* Copy action wrapper.
|
|
* @param {String|HTMLElement} target
|
|
* @param {Object} options
|
|
* @return {String}
|
|
*/
|
|
const ClipboardActionCopy = (
|
|
target,
|
|
options = { container: document.body }
|
|
) => {
|
|
let selectedText = '';
|
|
if (typeof target === 'string') {
|
|
selectedText = fakeCopyAction(target, options);
|
|
} else if (
|
|
target instanceof HTMLInputElement &&
|
|
!['text', 'search', 'url', 'tel', 'password'].includes(target?.type)
|
|
) {
|
|
// If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange
|
|
selectedText = fakeCopyAction(target.value, options);
|
|
} else {
|
|
selectedText = select(target);
|
|
command('copy');
|
|
}
|
|
return selectedText;
|
|
};
|
|
|
|
export default ClipboardActionCopy;
|