diff --git a/apps/roam/src/components/canvas/Tldraw.tsx b/apps/roam/src/components/canvas/Tldraw.tsx index e77e91dcd..b3c172911 100644 --- a/apps/roam/src/components/canvas/Tldraw.tsx +++ b/apps/roam/src/components/canvas/Tldraw.tsx @@ -140,6 +140,33 @@ export const discourseContext: DiscourseContextType = { lastActions: [], }; +let activeCanvasPageUid: string | null = null; +let activeCanvasEditor: Editor | null = null; + +const setActiveCanvas = ({ + pageUid, + editor, +}: { + pageUid: string; + editor: Editor | null; +}) => { + if (activeCanvasPageUid === pageUid && activeCanvasEditor === editor) { + if (editor && !editor.getInstanceState().isFocused) editor.focus(); + return; + } + + if (activeCanvasEditor && activeCanvasEditor !== editor) { + activeCanvasEditor.blur(); + } + + activeCanvasPageUid = pageUid; + activeCanvasEditor = editor; + + if (editor && !editor.getInstanceState().isFocused) { + editor.focus(); + } +}; + export const DEFAULT_WIDTH = 160; export const DEFAULT_HEIGHT = 64; export const MAX_WIDTH = "400px"; @@ -725,6 +752,17 @@ const TldrawCanvasShared = ({ inSidebar: !!containerRef.current?.closest(".rm-sidebar-outline"), }); }, [pageUid]); + + useEffect(() => { + return () => { + const editor = appRef.current; + if (activeCanvasPageUid === pageUid && activeCanvasEditor === editor) { + activeCanvasEditor?.blur(); + activeCanvasPageUid = null; + activeCanvasEditor = null; + } + }; + }, [pageUid]); const { store, needsUpgrade, performUpgrade, error, isLoading } = useStoreAdapter(storeAdapterArgs); const migratedCloudStoreRef = useRef(null); @@ -788,10 +826,14 @@ const TldrawCanvasShared = ({ uid?: string; val?: string; shapeId?: TLShapeId; + targetCanvasPageUid?: string; onRefresh: () => void; }>, ) => { if (!/canvas/i.test(e.detail.action)) return; + const targetCanvasPageUid = + e.detail.targetCanvasPageUid ?? activeCanvasPageUid; + if (targetCanvasPageUid !== pageUid) return; const app = appRef.current; if (!app) return; const { x, y } = app.getViewportScreenCenter(); @@ -829,7 +871,7 @@ const TldrawCanvasShared = ({ actionListener, ); }; - }, [appRef, allNodes]); + }, [appRef, allNodes, pageUid]); // Catch a custom event we used patch-package to add useEffect(() => { @@ -917,6 +959,10 @@ const TldrawCanvasShared = ({ tabIndex={-1} onDragOver={handleDragOver} onDrop={handleDrop} + onPointerDownCapture={() => { + if (!appRef.current) return; + setActiveCanvas({ pageUid, editor: appRef.current }); + }} > {isCloudflareSync && (
n.type), diff --git a/apps/roam/src/components/results-view/ResultsTable.tsx b/apps/roam/src/components/results-view/ResultsTable.tsx index 6b4300751..e32302e6d 100644 --- a/apps/roam/src/components/results-view/ResultsTable.tsx +++ b/apps/roam/src/components/results-view/ResultsTable.tsx @@ -229,7 +229,11 @@ const ResultRow = ({ return (