From 81ad95b34b971dc30b0bebd65e64780afa03abcb Mon Sep 17 00:00:00 2001 From: sid597 Date: Sun, 7 Dec 2025 13:04:58 +0530 Subject: [PATCH 1/3] optimise discourse node page observer, run isDiscourseNode only once --- .../utils/initializeObserversAndListeners.ts | 24 +++---- .../utils/renderLinkedReferenceAdditions.ts | 68 ++++++++----------- 2 files changed, 40 insertions(+), 52 deletions(-) diff --git a/apps/roam/src/utils/initializeObserversAndListeners.ts b/apps/roam/src/utils/initializeObserversAndListeners.ts index 8295b45be..11120a577 100644 --- a/apps/roam/src/utils/initializeObserversAndListeners.ts +++ b/apps/roam/src/utils/initializeObserversAndListeners.ts @@ -4,7 +4,7 @@ import { getPageTitleValueByHtmlElement, } from "roamjs-components/dom"; import { createBlock } from "roamjs-components/writes"; -import { renderLinkedReferenceAdditions } from "~/utils/renderLinkedReferenceAdditions"; +import { renderDiscourseContextAndCanvasReferences } from "~/utils/renderLinkedReferenceAdditions"; import { createConfigObserver } from "roamjs-components/components/ConfigPage"; import { renderTldrawCanvas, @@ -91,6 +91,16 @@ export const initObservers = async ({ const uid = getPageUidByPageTitle(title); if (isDiscourseNode(uid)) { renderPossibleDuplicates(h1, title); + const linkedReferencesDiv = document.querySelector( + ".rm-reference-main", + ) as HTMLDivElement; + if (linkedReferencesDiv) { + renderDiscourseContextAndCanvasReferences( + linkedReferencesDiv, + uid, + onloadArgs, + ); + } } if (isNodeConfigPage(title)) renderNodeConfigPage(props); @@ -100,17 +110,6 @@ export const initObservers = async ({ }, }); - // TODO: contains roam query: https://github.com/DiscourseGraphs/discourse-graph/issues/39 - const linkedReferencesObserver = createHTMLObserver({ - tag: "DIV", - useBody: true, - className: "rm-reference-main", - callback: async (el) => { - const div = el as HTMLDivElement; - await renderLinkedReferenceAdditions(div, onloadArgs); - }, - }); - const queryBlockObserver = createButtonObserver({ attribute: "query-block", render: (b) => renderQueryBlock(b, onloadArgs), @@ -399,7 +398,6 @@ export const initObservers = async ({ pageTitleObserver, queryBlockObserver, configPageObserver, - linkedReferencesObserver, graphOverviewExportObserver, nodeTagPopupButtonObserver, leftSidebarObserver, diff --git a/apps/roam/src/utils/renderLinkedReferenceAdditions.ts b/apps/roam/src/utils/renderLinkedReferenceAdditions.ts index d7caa1629..2cac6f08f 100644 --- a/apps/roam/src/utils/renderLinkedReferenceAdditions.ts +++ b/apps/roam/src/utils/renderLinkedReferenceAdditions.ts @@ -1,50 +1,40 @@ import { createElement } from "react"; -import { getPageTitleValueByHtmlElement } from "roamjs-components/dom"; -import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle"; import renderWithUnmount from "roamjs-components/util/renderWithUnmount"; import { DiscourseContext } from "~/components"; import CanvasReferences from "~/components/canvas/CanvasReferences"; -import isDiscourseNode from "./isDiscourseNode"; import { OnloadArgs } from "roamjs-components/types"; -export const renderLinkedReferenceAdditions = async ( +export const renderDiscourseContextAndCanvasReferences = ( div: HTMLDivElement, + uid: string, onloadArgs: OnloadArgs, -) => { - const isMainWindow = !!div.closest(".roam-article"); - const uid = isMainWindow - ? await window.roamAlphaAPI.ui.mainWindow.getOpenPageOrBlockUid() - : getPageUidByPageTitle(getPageTitleValueByHtmlElement(div)); - if ( - uid && - isDiscourseNode(uid) && - !div.getAttribute("data-roamjs-discourse-context") - ) { - div.setAttribute("data-roamjs-discourse-context", "true"); - const parent = div.firstElementChild; - if (parent) { - const insertBefore = parent.firstElementChild; +): void => { + if (div.getAttribute("data-roamjs-discourse-context")) return; - const p = document.createElement("div"); - parent.insertBefore(p, insertBefore); - renderWithUnmount( - createElement(DiscourseContext, { - uid, - results: [], - }), - p, - onloadArgs, - ); + div.setAttribute("data-roamjs-discourse-context", "true"); + const parent = div.firstElementChild; + if (!parent) return; - const canvasP = document.createElement("div"); - parent.insertBefore(canvasP, insertBefore); - renderWithUnmount( - createElement(CanvasReferences, { - uid, - }), - canvasP, - onloadArgs, - ); - } - } + const insertBefore = parent.firstElementChild; + + const p = document.createElement("div"); + parent.insertBefore(p, insertBefore); + renderWithUnmount( + createElement(DiscourseContext, { + uid, + results: [], + }), + p, + onloadArgs, + ); + + const canvasP = document.createElement("div"); + parent.insertBefore(canvasP, insertBefore); + renderWithUnmount( + createElement(CanvasReferences, { + uid, + }), + canvasP, + onloadArgs, + ); }; From bcff59d193cdc70ed668656c507470e0028979e3 Mon Sep 17 00:00:00 2001 From: sid597 Date: Thu, 18 Dec 2025 19:33:57 +0530 Subject: [PATCH 2/3] remove overlay from node dialog, remove usenoecontext, pass node from top of initialise discourse graph, create util --- apps/roam/src/components/CreateNodeDialog.tsx | 2 - .../src/components/VectorDuplicateMatches.tsx | 16 +++-- .../roam/src/utils/extractContentFromTitle.ts | 28 ++++++++ .../utils/initializeObserversAndListeners.ts | 9 ++- apps/roam/src/utils/useNodeContext.ts | 69 ------------------- 5 files changed, 45 insertions(+), 79 deletions(-) create mode 100644 apps/roam/src/utils/extractContentFromTitle.ts delete mode 100644 apps/roam/src/utils/useNodeContext.ts diff --git a/apps/roam/src/components/CreateNodeDialog.tsx b/apps/roam/src/components/CreateNodeDialog.tsx index d1666b259..4211f7c56 100644 --- a/apps/roam/src/components/CreateNodeDialog.tsx +++ b/apps/roam/src/components/CreateNodeDialog.tsx @@ -12,7 +12,6 @@ import getDiscourseNodes, { import { getNewDiscourseNodeText } from "~/utils/formatUtils"; import MenuItemSelect from "roamjs-components/components/MenuItemSelect"; import createBlock from "roamjs-components/writes/createBlock"; -import { VectorDuplicateMatches } from "./VectorDuplicateMatches"; export type CreateNodeDialogProps = { onClose: () => void; @@ -137,7 +136,6 @@ const CreateNodeDialog = ({ onChange={(e) => setTitle(e.currentTarget.value)} inputRef={inputRef} /> -