aboutsummaryrefslogtreecommitdiff
path: root/apps/web/components/canvas/tldrawComponent.tsx
blob: 717a58ed77283528a4db55268be132a5cd6702c1 (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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
import React, {
	createContext,
	memo,
	useCallback,
	useEffect,
	useState,
} from "react";
import { Editor, TLStoreWithStatus, Tldraw, setUserPreferences } from "tldraw";
import { components } from "./enabled";
import { twitterCardUtil } from "./custom_nodes/twittercard";
import { textCardUtil } from "./custom_nodes/textcard";
import DropZone from "./tldrawDrop";
import { loadRemoteSnapshot } from "@/lib/loadSnap";
import { createAssetFromUrl } from "@/lib/createAssetUrl";
import { SaveStatus } from "./savesnap";
import createEmbedsFromUrl from "@/lib/createEmbeds";

interface DragContextType {
	isDraggingOver: boolean;
	setIsDraggingOver: React.Dispatch<React.SetStateAction<boolean>>;
}

export const DragContext = createContext<DragContextType | undefined>(
	undefined,
);

function TldrawComponent({ id }: { id: string }) {
	const [isDraggingOver, setIsDraggingOver] = useState<boolean>(false);
	return (
		<DragContext.Provider value={{ isDraggingOver, setIsDraggingOver }}>
			<div className="h-[98vh]" onDragOver={() => setIsDraggingOver(true)}>
				<Thinkpad id={id} />
			</div>
		</DragContext.Provider>
	);
}

export const Thinkpad = memo(({ id }: { id: string }) => {
	const [storeWithStatus, setStoreWithStatus] = useState<TLStoreWithStatus>({
		status: "loading",
	});
	useEffect(() => {
		const fetchStore = async () => {
			const store = await loadRemoteSnapshot(id);

			setStoreWithStatus({
				store: store,
				status: "not-synced",
			});
		};

		fetchStore();
	}, []);

	const handleMount = useCallback((editor: Editor) => {
		(window as any).app = editor;
		(window as any).editor = editor;
		editor.registerExternalAssetHandler("url", createAssetFromUrl);
		editor.registerExternalContentHandler("url", ({ url, point, sources }) => {
			createEmbedsFromUrl({ url, point, sources, editor });
		});
	}, []);

	setUserPreferences({ id: "supermemory", colorScheme: "dark" });

	return (
		<Tldraw
			className="relative"
			components={components}
			store={storeWithStatus}
			shapeUtils={[twitterCardUtil, textCardUtil]}
			onMount={handleMount}
		>
			<DropZone />
			<div className="absolute left-1/2 top-0 z-[1000000] flex -translate-x-1/2 gap-2 bg-[#2C3439] text-[#B3BCC5]">
				<SaveStatus id={id} />
			</div>
		</Tldraw>
	);
});

export default TldrawComponent;