Files
ColdBreeze-chat-web/src/common/hook/useCopy.js
T
2022-05-25 14:12:51 +08:00

63 lines
1.6 KiB
JavaScript

import { useState, useEffect } from "react";
import { copyImageToClipboard } from "copy-image-clipboard";
import toast from "react-hot-toast";
const useCopy = (config) => {
const { enableToast = true } = config || {};
const [copied, setCopied] = useState(false);
useEffect(() => {
if (copied && enableToast) {
toast.success("Copied!");
}
}, [copied]);
const copyToClipboard = (str) => {
const el = document.createElement("textarea");
el.value = str;
el.setAttribute("readonly", "");
el.style.position = "absolute";
el.style.left = "-9999px";
document.body.appendChild(el);
const selected =
document.getSelection().rangeCount > 0
? document.getSelection().getRangeAt(0)
: false;
el.select();
const success = document.execCommand("copy");
document.body.removeChild(el);
if (selected) {
document.getSelection().removeAllRanges();
document.getSelection().addRange(selected);
}
return success;
};
const copy = (text, isImage = false) => {
let inter = 0;
console.log("copy", text, isImage);
if (!copied) {
if (!isImage) {
setCopied(copyToClipboard(text));
inter = setTimeout(() => {
setCopied(false);
}, 500);
} else {
copyImageToClipboard(text).then(() => {
setCopied(true);
inter = setTimeout(() => {
setCopied(false);
}, 500);
});
}
}
return () => {
clearTimeout(inter);
};
};
return { copied, copy };
};
export default useCopy;