|
|
|
|
@ -7,12 +7,10 @@ import { AppState } from "./types";
@@ -7,12 +7,10 @@ import { AppState } from "./types";
|
|
|
|
|
import { SVG_EXPORT_TAG } from "./scene/export"; |
|
|
|
|
import { tryParseSpreadsheet, Spreadsheet, VALID_SPREADSHEET } from "./charts"; |
|
|
|
|
import { canvasToBlob } from "./data/blob"; |
|
|
|
|
|
|
|
|
|
const TYPE_ELEMENTS = "excalidraw/elements"; |
|
|
|
|
import { EXPORT_DATA_TYPES } from "./constants"; |
|
|
|
|
|
|
|
|
|
type ElementsClipboard = { |
|
|
|
|
type: typeof TYPE_ELEMENTS; |
|
|
|
|
created: number; |
|
|
|
|
type: typeof EXPORT_DATA_TYPES.excalidrawClipboard; |
|
|
|
|
elements: ExcalidrawElement[]; |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
@ -31,8 +29,16 @@ export const probablySupportsClipboardBlob =
@@ -31,8 +29,16 @@ export const probablySupportsClipboardBlob =
|
|
|
|
|
"ClipboardItem" in window && |
|
|
|
|
"toBlob" in HTMLCanvasElement.prototype; |
|
|
|
|
|
|
|
|
|
const isElementsClipboard = (contents: any): contents is ElementsClipboard => { |
|
|
|
|
if (contents?.type === TYPE_ELEMENTS) { |
|
|
|
|
const clipboardContainsElements = ( |
|
|
|
|
contents: any, |
|
|
|
|
): contents is { elements: ExcalidrawElement[] } => { |
|
|
|
|
if ( |
|
|
|
|
[ |
|
|
|
|
EXPORT_DATA_TYPES.excalidraw, |
|
|
|
|
EXPORT_DATA_TYPES.excalidrawClipboard, |
|
|
|
|
].includes(contents?.type) && |
|
|
|
|
Array.isArray(contents.elements) |
|
|
|
|
) { |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
return false; |
|
|
|
|
@ -43,8 +49,7 @@ export const copyToClipboard = async (
@@ -43,8 +49,7 @@ export const copyToClipboard = async (
|
|
|
|
|
appState: AppState, |
|
|
|
|
) => { |
|
|
|
|
const contents: ElementsClipboard = { |
|
|
|
|
type: TYPE_ELEMENTS, |
|
|
|
|
created: Date.now(), |
|
|
|
|
type: EXPORT_DATA_TYPES.excalidrawClipboard, |
|
|
|
|
elements: getSelectedElements(elements, appState), |
|
|
|
|
}; |
|
|
|
|
const json = JSON.stringify(contents); |
|
|
|
|
@ -131,15 +136,9 @@ export const parseClipboard = async (
@@ -131,15 +136,9 @@ export const parseClipboard = async (
|
|
|
|
|
|
|
|
|
|
try { |
|
|
|
|
const systemClipboardData = JSON.parse(systemClipboard); |
|
|
|
|
// system clipboard elements are newer than in-app clipboard
|
|
|
|
|
if ( |
|
|
|
|
isElementsClipboard(systemClipboardData) && |
|
|
|
|
(!appClipboardData?.created || |
|
|
|
|
appClipboardData.created < systemClipboardData.created) |
|
|
|
|
) { |
|
|
|
|
if (clipboardContainsElements(systemClipboardData)) { |
|
|
|
|
return { elements: systemClipboardData.elements }; |
|
|
|
|
} |
|
|
|
|
// in-app clipboard is newer than system clipboard
|
|
|
|
|
return appClipboardData; |
|
|
|
|
} catch { |
|
|
|
|
// system clipboard doesn't contain excalidraw elements → return plaintext
|
|
|
|
|
|