clipboard.ts

1.4 KB · raw

1import { getSettings } from "./vault";23const DEFAULT_CLEAR_SECONDS = 30;45let clipboardClearTimer: ReturnType<typeof setTimeout> | null = null;67async function writeToClipboard(text: string): Promise<void> {8  // Prefer chrome.scripting.executeScript which reliably works in MV3 service workers9  // by running in the context of the active tab page, falling back to direct write.10  try {11    const [tab] = await chrome.tabs.query({ active: true, currentWindow: true });12    if (tab?.id) {13      await chrome.scripting.executeScript({14        target: { tabId: tab.id },15        func: (value: string) => navigator.clipboard.writeText(value),16        args: [text],17      });18      return;19    }20  } catch {21    // Fall through to direct write22  }23  // Fallback: direct navigator.clipboard (may fail if service worker is backgrounded)24  await navigator.clipboard.writeText(text);25}2627export async function copyToClipboard(text: string, _label: string): Promise<void> {28  if (clipboardClearTimer) {29    clearTimeout(clipboardClearTimer);30    clipboardClearTimer = null;31  }32  await writeToClipboard(text);3334  const settingsSeconds = getSettings().clipboardClearSeconds;35  const clearAfterMs =36    (typeof settingsSeconds === "number" && settingsSeconds > 037      ? settingsSeconds38      : DEFAULT_CLEAR_SECONDS) * 1000;3940  clipboardClearTimer = setTimeout(async () => {41    try {42      await writeToClipboard("");43    } catch {}44    clipboardClearTimer = null;45  }, clearAfterMs);46}