Skip to content

Commit 2c93736

Browse files
authored
added copy to clipboard (#105)
1 parent 50c5e8c commit 2c93736

File tree

1 file changed

+46
-1
lines changed

1 file changed

+46
-1
lines changed

src/components/Controller/Controller.tsx

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import {
88
faRotate,
99
faCheckCircle,
10+
faClipboard,
1011
faGear,
1112
} from "@fortawesome/free-solid-svg-icons";
1213
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@@ -219,7 +220,7 @@ const Controller = () => {
219220
};
220221

221222
const onScriptFileChange = (event: ChangeEvent<HTMLInputElement>) => {
222-
const fileList = event.target.files;
223+
const fileList = event.target.files;
223224
if (!fileList) return;
224225

225226
let file = fileList[0];
@@ -281,6 +282,41 @@ const Controller = () => {
281282
reader.readAsText(file);
282283
}
283284
};
285+
286+
const copyScreenToClipboard = async () => {
287+
const screenGroup = document.getElementById("screenGroup");
288+
const screenCanvas = screenGroup?.querySelector("canvas");
289+
290+
if (!screenCanvas) {
291+
alert("No screen is available to copy.");
292+
return;
293+
}
294+
295+
try {
296+
if (!navigator.clipboard || typeof ClipboardItem === "undefined") {
297+
throw new Error("Clipboard image copy not supported");
298+
}
299+
300+
const screenBlob = await new Promise<Blob | null>((resolve) => {
301+
screenCanvas.toBlob(resolve, "image/png");
302+
});
303+
304+
if (!screenBlob) {
305+
throw new Error("Failed to create screen image");
306+
}
307+
308+
await navigator.clipboard.write([
309+
new ClipboardItem({
310+
[screenBlob.type]: screenBlob,
311+
}),
312+
]);
313+
314+
alert("Screen copied to clipboard");
315+
} catch (error) {
316+
console.error("Failed to copy screen to clipboard", error);
317+
alert("Failed to copy screen to clipboard");
318+
}
319+
};
284320

285321
const toggleLiveScreen = (shouldUpdate: boolean) => {
286322
if (!shouldUpdate) write("screenframeshort", false);
@@ -379,6 +415,15 @@ const Controller = () => {
379415
}
380416
shortcutKeys={"mod+R"}
381417
/>
418+
<HotkeyButton
419+
label={<FontAwesomeIcon icon={faClipboard} />}
420+
disabled={disableTransmitAction}
421+
onClickFunction={copyScreenToClipboard}
422+
className={
423+
"size-6 min-w-6 rounded-sm bg-slate-700 hover:bg-slate-600 text-white p-1 transition-colors duration-150 hover:drop-shadow-[0_0_4px_rgba(255,255,255,0.4)] flex items-center justify-center"
424+
}
425+
shortcutKeys={""}
426+
/>
382427
</div>
383428
</div>
384429
</div>

0 commit comments

Comments
 (0)