Files
ColdBreeze-chat-web/src/common/hook/useCopy.ts
T
2022-07-04 18:15:24 +08:00

62 lines
1.6 KiB
TypeScript

import { useState, useEffect } from "react";
import { copyImageToClipboard } from "copy-image-clipboard";
import toast from "react-hot-toast";
const useCopy = (config: { enableToast: boolean } | void) => {
const { enableToast = true } = config || {};
const [copied, setCopied] = useState(false);
useEffect(() => {
if (copied && enableToast) {
toast.success("Copied!");
}
}, [copied]);
const copyToClipboard = (str: string) => {
const el = document.createElement("textarea");
el.value = str;
el.setAttribute("readonly", "");
el.style.position = "absolute";
el.style.left = "-9999px";
document.body.appendChild(el);
const selection = document.getSelection();
if (!selection) return false;
const selected = selection.rangeCount > 0 ? selection.getRangeAt(0) : false;
el.select();
const success = document.execCommand("copy");
document.body.removeChild(el);
if (selected) {
selection.removeAllRanges();
selection.addRange(selected);
}
return success;
};
const copy = (text: string, 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;