use-clipboard-copy
Version:
Lightweight copy to clipboard hook for React
65 lines (64 loc) • 2.23 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.useClipboard = void 0;
var clipboard_copy_1 = __importDefault(require("clipboard-copy"));
var react_1 = require("react");
var useTimedToggle_1 = require("./useTimedToggle");
function isInputLike(node) {
return node && (node.nodeName === 'TEXTAREA' || node.nodeName === 'INPUT');
}
function useClipboard(options) {
if (options === void 0) { options = {}; }
var _a = useTimedToggle_1.useTimedToggle(false), copied = _a[0], toggleCopied = _a[1];
var targetRef = react_1.useRef(null);
var optionsRef = react_1.useRef(options);
optionsRef.current = options;
function isSupported() {
return (!!navigator.clipboard ||
(typeof document.execCommand === 'function' &&
typeof document.queryCommandSupported === 'function' &&
document.queryCommandSupported('copy')));
}
var copyHandler = react_1.useCallback(function (text) {
var opts = optionsRef.current;
var target = targetRef.current;
function handleSuccess() {
if (opts.onSuccess) {
opts.onSuccess();
}
if (opts.copiedTimeout) {
toggleCopied(opts.copiedTimeout);
}
if (opts.selectOnCopy && isInputLike(target)) {
target.select();
}
}
function handleError() {
if (opts.onError) {
opts.onError();
}
if (opts.selectOnError !== false && isInputLike(target)) {
target.select();
}
}
function copy(value) {
clipboard_copy_1.default(value).then(handleSuccess).catch(handleError);
}
if (typeof text === 'string') {
copy(text);
}
else if (target) {
copy(target.value);
}
}, []);
return {
copied: copied,
copy: copyHandler,
isSupported: isSupported,
target: targetRef,
};
}
exports.useClipboard = useClipboard;