Files
overleaf-cep/services/web/frontend/js/features/source-editor/utils/paste-image.ts
Malik Glossop a0fc14b367 Merge pull request #30495 from overleaf/mg-context-menu-paste
[web] Support paste with formatting in context menu

GitOrigin-RevId: 551ed1d49ca423395bd9bfc756e10e8d59d71ecd
2026-01-15 14:19:03 +00:00

61 lines
1.3 KiB
TypeScript

export const ALLOWED_IMAGE_TYPES = new Set([
'image/jpeg',
'image/png',
'application/pdf',
])
export function isAllowedImageType(mimeType: string): boolean {
return ALLOWED_IMAGE_TYPES.has(mimeType)
}
export type PastedImageData = {
name: string
type: string
data: Blob
}
export function dispatchFigureModalPasteEvent(
imageData: PastedImageData
): void {
window.dispatchEvent(
new CustomEvent<PastedImageData>('figure-modal:paste-image', {
detail: imageData,
})
)
}
export async function findImageInClipboard(): Promise<File | null> {
try {
const clipboardItems = await navigator.clipboard.read()
for (const item of clipboardItems) {
for (const type of item.types) {
if (isAllowedImageType(type)) {
const blob = await item.getType(type)
const file = new File([blob], `image.${type.split('/')[1]}`, {
type,
})
return file
}
}
}
} catch (error) {
// Clipboard.read() may fail in some browsers
}
return null
}
export const handleImagePaste = async (): Promise<boolean> => {
const imageFile = await findImageInClipboard()
if (imageFile) {
dispatchFigureModalPasteEvent({
name: imageFile.name,
type: imageFile.type,
data: imageFile,
})
return true
}
return false
}