diff --git a/packages/app-core/src/state/useDataLoaders.ts b/packages/app-core/src/state/useDataLoaders.ts index 345d19faf..034f2bf7c 100644 --- a/packages/app-core/src/state/useDataLoaders.ts +++ b/packages/app-core/src/state/useDataLoaders.ts @@ -423,7 +423,6 @@ export function useDataLoaders(deps: DataLoadersDeps) { setOwnerNameState(persisted); } }) - .catch(() => {}) .catch(() => {}); return () => { diff --git a/packages/ui/src/components/ui/copy-button.tsx b/packages/ui/src/components/ui/copy-button.tsx index c6a457ec8..28cf8d50e 100644 --- a/packages/ui/src/components/ui/copy-button.tsx +++ b/packages/ui/src/components/ui/copy-button.tsx @@ -28,11 +28,28 @@ export const CopyButton = React.forwardRef( ref, ) => { const [copied, setCopied] = React.useState(false); + const timerRef = React.useRef>(null); + + React.useEffect(() => { + return () => { + if (timerRef.current) clearTimeout(timerRef.current); + }; + }, []); const handleCopy = React.useCallback(() => { - void navigator.clipboard.writeText(value); - setCopied(true); - setTimeout(() => setCopied(false), feedbackDuration); + navigator.clipboard.writeText(value).then( + () => { + setCopied(true); + if (timerRef.current) clearTimeout(timerRef.current); + timerRef.current = setTimeout( + () => setCopied(false), + feedbackDuration, + ); + }, + () => { + /* clipboard write failed — don't show false "copied" feedback */ + }, + ); }, [value, feedbackDuration]); return (