You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
1.3 KiB
47 lines
1.3 KiB
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;
|
|
|