Skip to content

Commit cc2585f

Browse files
committed
Make toolbar errors copyable
1 parent b397c3f commit cc2585f

2 files changed

Lines changed: 44 additions & 2 deletions

File tree

client/src/features/toolbar/Toolbar.tsx

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { RefObject } from "react";
1+
import { useEffect, useState, type RefObject } from "react";
22

33
import type { SimulatorMetadata, VideoCodecMode } from "../../api/types";
44
import type { StreamTransportMode } from "../stream/streamWorkerClient";
@@ -73,6 +73,25 @@ export function Toolbar({
7373
touchOverlayVisible,
7474
videoCodec,
7575
}: ToolbarProps) {
76+
const [errorCopied, setErrorCopied] = useState(false);
77+
78+
useEffect(() => {
79+
setErrorCopied(false);
80+
}, [error]);
81+
82+
async function copyError() {
83+
if (!error) {
84+
return;
85+
}
86+
try {
87+
await navigator.clipboard.writeText(error);
88+
setErrorCopied(true);
89+
window.setTimeout(() => setErrorCopied(false), 1200);
90+
} catch {
91+
setErrorCopied(false);
92+
}
93+
}
94+
7695
return (
7796
<header className="toolbar">
7897
<div className="toolbar-left">
@@ -205,7 +224,16 @@ export function Toolbar({
205224
</button>
206225
</div>
207226
) : null}
208-
{error ? <span className="error-msg">{error}</span> : null}
227+
{error ? (
228+
<button
229+
className={`error-msg ${errorCopied ? "copied" : ""}`}
230+
onClick={copyError}
231+
title={errorCopied ? "Copied" : "Copy error"}
232+
type="button"
233+
>
234+
{errorCopied ? "Copied" : error}
235+
</button>
236+
) : null}
209237
</div>
210238
</header>
211239
);

client/src/styles/components.css

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1380,6 +1380,11 @@
13801380
}
13811381

13821382
.error-msg {
1383+
height: 24px;
1384+
padding: 0 6px;
1385+
border: 1px solid transparent;
1386+
border-radius: 5px;
1387+
background: transparent;
13831388
color: var(--error);
13841389
font-size: 11px;
13851390
white-space: nowrap;
@@ -1389,6 +1394,15 @@
13891394
max-width: 220px;
13901395
}
13911396

1397+
.error-msg:hover {
1398+
border-color: color-mix(in srgb, var(--error) 35%, transparent);
1399+
background: color-mix(in srgb, var(--error) 10%, transparent);
1400+
}
1401+
1402+
.error-msg.copied {
1403+
color: var(--text);
1404+
}
1405+
13921406
.muted {
13931407
color: var(--text-muted);
13941408
}

0 commit comments

Comments
 (0)