+ ).detail;
+ if (!detail?.uids.includes(uid)) return;
+ onRefresh(true);
+ };
+
+ document.body.addEventListener(
+ DISCOURSE_CONTEXT_MUTATION_REFRESH_EVENT,
+ onMutationRefresh,
+ );
+ return () => {
+ document.body.removeEventListener(
+ DISCOURSE_CONTEXT_MUTATION_REFRESH_EVENT,
+ onMutationRefresh,
+ );
+ };
+ }, [uid, onRefresh]);
const [tabId, setTabId] = useState(0);
const [groupByTarget, setGroupByTarget] = useState(false);
return queryResults.length ? (
@@ -235,7 +261,13 @@ export const ContextContent = ({ uid, results, overlayRefresh }: Props) => {
) : (
No discourse relations found.
-
+ {
+ if (!created) return;
+ delayedRefresh();
+ }}
+ />
);
};
diff --git a/apps/roam/src/components/DiscourseContextOverlay.tsx b/apps/roam/src/components/DiscourseContextOverlay.tsx
index 0b7cd4d3d..6e956c4a9 100644
--- a/apps/roam/src/components/DiscourseContextOverlay.tsx
+++ b/apps/roam/src/components/DiscourseContextOverlay.tsx
@@ -7,7 +7,6 @@ import {
Card,
} from "@blueprintjs/core";
import React, { useCallback, useEffect, useMemo, useState } from "react";
-import ReactDOM from "react-dom";
import renderWithUnmount from "roamjs-components/util/renderWithUnmount";
import { ContextContent } from "./DiscourseContext";
import useInViewport from "react-in-viewport/dist/es/lib/useInViewport";
@@ -22,7 +21,6 @@ import getDiscourseContextResults from "~/utils/getDiscourseContextResults";
import findDiscourseNode from "~/utils/findDiscourseNode";
import getDiscourseNodes from "~/utils/getDiscourseNodes";
import getDiscourseRelations from "~/utils/getDiscourseRelations";
-import ExtensionApiContextProvider from "roamjs-components/components/ExtensionApiContext";
import { OnloadArgs } from "roamjs-components/types/native";
import getPageTitleByPageUid from "roamjs-components/queries/getPageTitleByPageUid";
import internalError from "~/utils/internalError";
diff --git a/apps/roam/src/components/results-view/ResultsTable.tsx b/apps/roam/src/components/results-view/ResultsTable.tsx
index f5f9e1d8d..fb02137d9 100644
--- a/apps/roam/src/components/results-view/ResultsTable.tsx
+++ b/apps/roam/src/components/results-view/ResultsTable.tsx
@@ -23,6 +23,7 @@ import { ContextContent } from "~/components/DiscourseContext";
import DiscourseContextOverlay from "~/components/DiscourseContextOverlay";
import { CONTEXT_OVERLAY_SUGGESTION } from "~/utils/predefinedSelections";
import { strictQueryForReifiedBlocks } from "~/utils/createReifiedBlock";
+import { refreshDiscourseContextsForMutatedUids } from "~/utils/discourseContextMutationRefresh";
import { getStoredRelationsEnabled } from "~/utils/storedRelations";
import {
RenderRoamBlock,
@@ -286,7 +287,9 @@ const ResultRow = ({
content: "Relation deleted",
intent: "success",
});
- onRefresh(true);
+ refreshDiscourseContextsForMutatedUids({
+ uids: [data.sourceUid, data.destinationUid],
+ });
})
.catch((e) => {
// this one should be an internalError
diff --git a/apps/roam/src/utils/discourseContextMutationRefresh.ts b/apps/roam/src/utils/discourseContextMutationRefresh.ts
new file mode 100644
index 000000000..326b7e07c
--- /dev/null
+++ b/apps/roam/src/utils/discourseContextMutationRefresh.ts
@@ -0,0 +1,25 @@
+export const DISCOURSE_CONTEXT_MUTATION_REFRESH_EVENT =
+ "roamjs:discourse-context:mutation-refresh";
+
+export type DiscourseContextMutationRefreshDetail = {
+ uids: string[];
+};
+
+export const refreshDiscourseContextsForMutatedUids = ({
+ uids,
+}: DiscourseContextMutationRefreshDetail): void => {
+ const uniqueUids = Array.from(
+ new Set(uids.map((uid) => uid?.trim()).filter(Boolean)),
+ );
+ if (!uniqueUids.length) return;
+ document.body.dispatchEvent(
+ new CustomEvent(
+ DISCOURSE_CONTEXT_MUTATION_REFRESH_EVENT,
+ {
+ detail: {
+ uids: uniqueUids,
+ },
+ },
+ ),
+ );
+};
diff --git a/apps/roam/src/utils/matchDiscourseNode.ts b/apps/roam/src/utils/matchDiscourseNode.ts
index d0f652497..f0e05522b 100644
--- a/apps/roam/src/utils/matchDiscourseNode.ts
+++ b/apps/roam/src/utils/matchDiscourseNode.ts
@@ -20,9 +20,10 @@ const matchDiscourseNode = ({
)) => {
// Handle specification with single "has title" clause
if (
- specification.length === 1 &&
- specification[0].type === "clause" &&
- specification[0].relation === "has title"
+ specification?.length === 1 &&
+ specification[0]?.type === "clause" &&
+ specification[0]?.relation === "has title" &&
+ specification[0]?.target
) {
const title =
"title" in rest ? rest.title : getPageTitleByPageUid(rest.uid);