summaryrefslogtreecommitdiff
path: root/apps/web/src/clipboard/handlers/index.ts
blob: 29d4d1d043e7113ac66274811c53cae15ee4b58f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import type {
	ClipboardEntry,
	ClipboardEntryType,
	ClipboardHandler,
	ClipboardHandlerMap,
	CopyContext,
	PasteContext,
} from "../types";
import { ElementsClipboardHandler } from "./elements";
import { KeyframesClipboardHandler } from "./keyframes";

export const clipboardHandlers = {
	elements: ElementsClipboardHandler,
	keyframes: KeyframesClipboardHandler,
} satisfies ClipboardHandlerMap;

export const clipboardCopyHandlers = [
	KeyframesClipboardHandler,
	ElementsClipboardHandler,
] as const satisfies readonly ClipboardHandler<ClipboardEntryType>[];

export function copyClipboardEntry({
	context,
}: {
	context: CopyContext;
}): ClipboardEntry | null {
	for (const handler of clipboardCopyHandlers) {
		if (!handler.canCopy(context)) {
			continue;
		}

		return handler.copy(context);
	}

	return null;
}

export function buildPasteClipboardCommand({
	entry,
	context,
}: {
	entry: ClipboardEntry;
	context: PasteContext;
}) {
	const handler = clipboardHandlers[entry.type] as ClipboardHandler<
		typeof entry.type
	>;
	return handler.paste(entry as never, context);
}