47 lines
1.3 KiB
TypeScript
47 lines
1.3 KiB
TypeScript
const captureVisibleTab = () => {
|
|
const result = new Promise<string>((resolve) => {
|
|
if (import.meta.env.BROWSER === "chrome" || import.meta.env.BROWSER === "edge") {
|
|
chrome.tabs.query({ active: true, currentWindow: true }, async (tabs) => {
|
|
const tab = tabs[0]
|
|
chrome.tabs.captureVisibleTab(null, { format: "png" }, (dataUrl) => {
|
|
resolve(dataUrl)
|
|
})
|
|
})
|
|
} else {
|
|
browser.tabs
|
|
.query({ active: true, currentWindow: true })
|
|
.then(async (tabs) => {
|
|
const dataUrl = (await Promise.race([
|
|
browser.tabs.captureVisibleTab(null, { format: "png" }),
|
|
new Promise((_, reject) =>
|
|
setTimeout(
|
|
() => reject(new Error("Screenshot capture timed out")),
|
|
10000
|
|
)
|
|
)
|
|
])) as string
|
|
resolve(dataUrl)
|
|
})
|
|
}
|
|
})
|
|
return result
|
|
}
|
|
|
|
export const getScreenshotFromCurrentTab = async () => {
|
|
try {
|
|
const screenshotDataUrl = await captureVisibleTab()
|
|
return {
|
|
success: true,
|
|
screenshot: screenshotDataUrl,
|
|
error: null
|
|
}
|
|
} catch (error) {
|
|
return {
|
|
success: false,
|
|
screenshot: null,
|
|
error:
|
|
error instanceof Error ? error.message : "Failed to capture screenshot"
|
|
}
|
|
}
|
|
}
|