|
|
|
@ -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 =
|
|
|
|
|
"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 (
|
|
|
|
|
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 (
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|