29 lines
846 B
TypeScript
29 lines
846 B
TypeScript
// Routes `navigator.clipboard.writeText` through Electron IPC, since the
|
|
// renderer's clipboard API throws "Write permission denied" whenever the
|
|
// document loses focus (e.g. clicking a portaled Radix dropdown). The IPC
|
|
// path runs in the main process and is unconditional.
|
|
|
|
export function installClipboardShim() {
|
|
const ipc = window.hermesDesktop?.writeClipboard
|
|
|
|
if (!ipc || !navigator.clipboard) {
|
|
return
|
|
}
|
|
|
|
const native = navigator.clipboard.writeText?.bind(navigator.clipboard)
|
|
|
|
const writeText = async (text: string) => {
|
|
try {
|
|
await ipc(text)
|
|
} catch {
|
|
await native?.(text)
|
|
}
|
|
}
|
|
|
|
try {
|
|
Object.defineProperty(navigator.clipboard, 'writeText', { configurable: true, value: writeText, writable: true })
|
|
} catch {
|
|
// Browser refused override; primitives keep using the native API.
|
|
}
|
|
}
|