diff --git a/apps/roam/src/components/canvas/Tldraw.tsx b/apps/roam/src/components/canvas/Tldraw.tsx index eb102d5f1..265ff38be 100644 --- a/apps/roam/src/components/canvas/Tldraw.tsx +++ b/apps/roam/src/components/canvas/Tldraw.tsx @@ -643,8 +643,19 @@ const TldrawCanvasShared = ({ useEffect(() => { const handleDragStart = (e: DragEvent) => { const target = e.target as HTMLElement; - const uid = getBlockUidFromBullet(target); + const pageRef = target.closest(".rm-page-ref"); + if (pageRef) { + const pageTitle = ( + pageRef.getAttribute("data-tag") || + pageRef.parentElement?.getAttribute("data-link-title") + )?.replace(/\\"/g, '"'); + if (pageTitle) + e.dataTransfer?.setData("application/x-roam-page", pageTitle); + return; + } + + const uid = getBlockUidFromBullet(target); if (uid) e.dataTransfer?.setData("application/x-roam-uid", uid); }; @@ -658,6 +669,22 @@ const TldrawCanvasShared = ({ const handleDrop = (e: React.DragEvent) => { e.preventDefault(); + + const pageTitle = e.dataTransfer.getData("application/x-roam-page"); + if (pageTitle && appRef.current && extensionAPI) { + posthog.capture("Canvas: Roam Page Dropped"); + const dropPoint = appRef.current.screenToPage({ + x: e.clientX, + y: e.clientY, + }); + void appRef.current.putExternalContent({ + type: "text", + text: `[[${pageTitle}]]`, + point: dropPoint, + }); + return; + } + const uid = e.dataTransfer.getData("application/x-roam-uid"); if (!uid || !appRef.current || !extensionAPI) return; diff --git a/apps/roam/src/utils/initializeObserversAndListeners.ts b/apps/roam/src/utils/initializeObserversAndListeners.ts index 227dcd34a..8663f983d 100644 --- a/apps/roam/src/utils/initializeObserversAndListeners.ts +++ b/apps/roam/src/utils/initializeObserversAndListeners.ts @@ -21,6 +21,7 @@ import { addPageRefObserver, getPageRefObserversSize, previewPageRefHandler, + makePageRefDraggable, getOverlayHandler, onPageRefObserverChange, getSuggestiveOverlayHandler, @@ -242,6 +243,8 @@ export const initObservers = ({ onPageRefObserverChange(overlayHandler)(true); } + onPageRefObserverChange(makePageRefDraggable)(true); + if (getPageRefObserversSize()) enablePageRefObserver(); const configPageUid = getPageUidByPageTitle(DISCOURSE_CONFIG_PAGE_TITLE); @@ -466,6 +469,11 @@ export const initObservers = ({ discourseNodeSearchTriggerListener, nodeCreationPopoverListener, }, - cleanups: [unsubGlobalTrigger, unsubPersonalTrigger, unsubSearchTrigger], + cleanups: [ + unsubGlobalTrigger, + unsubPersonalTrigger, + unsubSearchTrigger, + () => onPageRefObserverChange(makePageRefDraggable)(false), + ], }; }; diff --git a/apps/roam/src/utils/pageRefObserverHandlers.ts b/apps/roam/src/utils/pageRefObserverHandlers.ts index cac2d362b..b9342c893 100644 --- a/apps/roam/src/utils/pageRefObserverHandlers.ts +++ b/apps/roam/src/utils/pageRefObserverHandlers.ts @@ -181,6 +181,10 @@ export const previewPageRefHandler = (s: HTMLSpanElement) => { } }; +export const makePageRefDraggable = (s: HTMLSpanElement) => { + s.draggable = true; +}; + export const enablePageRefObserver = () => { if (pageRefObserverRef.current) return pageRefObserverRef.current;