diff --git a/apps/roam/src/components/DiscourseNodeMenu.tsx b/apps/roam/src/components/DiscourseNodeMenu.tsx
index 60680e00f..eefa26640 100644
--- a/apps/roam/src/components/DiscourseNodeMenu.tsx
+++ b/apps/roam/src/components/DiscourseNodeMenu.tsx
@@ -27,7 +27,10 @@ import { getNewDiscourseNodeText } from "~/utils/formatUtils";
import { OnloadArgs } from "roamjs-components/types";
import { formatHexColor } from "./settings/DiscourseNodeCanvasSettings";
import posthog from "posthog-js";
-import { setPersonalSetting } from "~/components/settings/utils/accessors";
+import {
+ setPersonalSetting,
+ type SettingsSnapshot,
+} from "~/components/settings/utils/accessors";
import { PERSONAL_KEYS } from "~/components/settings/utils/settingKeys";
import type { PersonalSettings } from "~/components/settings/utils/zodSchema";
@@ -38,6 +41,7 @@ type Props = {
trigger?: JSX.Element;
isShift?: boolean;
menuMaxHeight?: number;
+ settingsSnapshot?: SettingsSnapshot;
};
const NodeMenu = ({
@@ -48,6 +52,7 @@ const NodeMenu = ({
trigger,
isShift,
menuMaxHeight,
+ settingsSnapshot,
}: { onClose: () => void } & Props) => {
const isInitialTextSelected =
!!textarea && textarea.selectionStart !== textarea.selectionEnd;
@@ -56,8 +61,11 @@ const NodeMenu = ({
isInitialTextSelected || (isShift ?? false),
);
const userDiscourseNodes = useMemo(
- () => getDiscourseNodes().filter((n) => n.backedBy === "user"),
- [],
+ () =>
+ getDiscourseNodes(undefined, settingsSnapshot).filter(
+ (n) => n.backedBy === "user",
+ ),
+ [settingsSnapshot],
);
const discourseNodes = userDiscourseNodes.filter(
(n) => showNodeTypes || n.tag,
@@ -359,10 +367,12 @@ export const TextSelectionNodeMenu = ({
textarea,
extensionAPI,
onClose,
+ settingsSnapshot,
}: {
textarea: HTMLTextAreaElement;
extensionAPI: OnloadArgs["extensionAPI"];
onClose: () => void;
+ settingsSnapshot?: SettingsSnapshot;
}) => {
const trigger = (
);
};
diff --git a/apps/roam/src/utils/getExportTypes.ts b/apps/roam/src/utils/getExportTypes.ts
index cabbe3fee..09ef6b78d 100644
--- a/apps/roam/src/utils/getExportTypes.ts
+++ b/apps/roam/src/utils/getExportTypes.ts
@@ -21,6 +21,10 @@ import {
pullBlockToTreeNode,
collectUids,
} from "./exportUtils";
+import {
+ bulkReadSettings,
+ type SettingsSnapshot,
+} from "~/components/settings/utils/accessors";
export const updateExportProgress = (detail: {
progress: number;
@@ -36,6 +40,7 @@ type getExportTypesProps = {
results?: ExportDialogProps["results"];
exportId: string;
isExportDiscourseGraph: boolean;
+ settingsSnapshot?: SettingsSnapshot;
};
type RoamImportUser = {
@@ -66,9 +71,11 @@ const getExportTypes = ({
results,
exportId,
isExportDiscourseGraph,
+ settingsSnapshot,
}: getExportTypesProps): ExportTypes => {
- const allRelations = getDiscourseRelations();
- const allNodes = getDiscourseNodes(allRelations);
+ const settings = settingsSnapshot ?? bulkReadSettings();
+ const allRelations = getDiscourseRelations(settings);
+ const allNodes = getDiscourseNodes(allRelations, settings);
const nodeLabelByType = Object.fromEntries(
allNodes.map((a) => [a.type, a.text]),
);
diff --git a/apps/roam/src/utils/initializeObserversAndListeners.ts b/apps/roam/src/utils/initializeObserversAndListeners.ts
index 227dcd34a..75e15cc15 100644
--- a/apps/roam/src/utils/initializeObserversAndListeners.ts
+++ b/apps/roam/src/utils/initializeObserversAndListeners.ts
@@ -229,7 +229,7 @@ export const initObservers = ({
className: "rm-inline-img",
callback: (img: HTMLElement) => {
if (img instanceof HTMLImageElement) {
- renderImageToolsMenu(img, onloadArgs.extensionAPI);
+ renderImageToolsMenu(img, onloadArgs.extensionAPI, settings);
}
},
});
@@ -443,6 +443,7 @@ export const initObservers = ({
extensionAPI: onloadArgs.extensionAPI,
blockElement,
textarea,
+ settingsSnapshot: settings,
});
} else {
removeTextSelectionPopup();
diff --git a/apps/roam/src/utils/pageRefObserverHandlers.ts b/apps/roam/src/utils/pageRefObserverHandlers.ts
index cac2d362b..d78252862 100644
--- a/apps/roam/src/utils/pageRefObserverHandlers.ts
+++ b/apps/roam/src/utils/pageRefObserverHandlers.ts
@@ -6,6 +6,10 @@ import { OnloadArgs } from "roamjs-components/types";
import { renderSuggestive as renderSuggestiveOverlay } from "~/components/SuggestiveModeOverlay";
import getDiscourseNodes, { type DiscourseNode } from "./getDiscourseNodes";
import findDiscourseNode from "./findDiscourseNode";
+import {
+ bulkReadSettings,
+ type SettingsSnapshot,
+} from "~/components/settings/utils/accessors";
const PAGE_REF_SELECTOR = "span.rm-page-ref";
const DISCOURSE_OVERLAY_CLASS = "roamjs-discourse-context-overlay";
@@ -24,11 +28,13 @@ type PageRefDiscourseNodeStatus = {
};
let batchDiscourseNodes: DiscourseNode[] | null = null;
+let batchSettingsSnapshot: SettingsSnapshot | null = null;
let clearBatchCacheQueued = false;
const pageRefDiscourseNodeCache = new Map();
const clearBatchCache = (): void => {
batchDiscourseNodes = null;
+ batchSettingsSnapshot = null;
pageRefDiscourseNodeCache.clear();
clearBatchCacheQueued = false;
};
@@ -39,10 +45,21 @@ const queueBatchCacheClear = (): void => {
queueMicrotask(clearBatchCache);
};
+const getBatchSettingsSnapshot = (): SettingsSnapshot => {
+ if (batchSettingsSnapshot) return batchSettingsSnapshot;
+
+ batchSettingsSnapshot = bulkReadSettings();
+ queueBatchCacheClear();
+ return batchSettingsSnapshot;
+};
+
const getBatchDiscourseNodes = (): DiscourseNode[] => {
if (batchDiscourseNodes) return batchDiscourseNodes;
- batchDiscourseNodes = getDiscourseNodes();
+ batchDiscourseNodes = getDiscourseNodes(
+ undefined,
+ getBatchSettingsSnapshot(),
+ );
queueBatchCacheClear();
return batchDiscourseNodes;
};
diff --git a/apps/roam/src/utils/renderImageToolsMenu.tsx b/apps/roam/src/utils/renderImageToolsMenu.tsx
index 99a7697e2..4b2ef884e 100644
--- a/apps/roam/src/utils/renderImageToolsMenu.tsx
+++ b/apps/roam/src/utils/renderImageToolsMenu.tsx
@@ -5,17 +5,24 @@ import getUids from "roamjs-components/dom/getUids";
import NodeMenu from "~/components/DiscourseNodeMenu";
import { OnloadArgs } from "roamjs-components/types";
import posthog from "posthog-js";
+import {
+ bulkReadSettings,
+ type SettingsSnapshot,
+} from "~/components/settings/utils/accessors";
type ImageToolsMenuProps = {
blockUid: string;
extensionAPI: OnloadArgs["extensionAPI"];
+ initialSettings: SettingsSnapshot;
};
const ImageToolsMenu = ({
blockUid,
extensionAPI,
+ initialSettings,
}: ImageToolsMenuProps): JSX.Element => {
const [menuKey, setMenuKey] = useState(0);
+ const [settings, setSettings] = useState(initialSettings);
const handleEditBlock = useCallback((): void => {
posthog.capture("Image Tools Menu: Edit Block Clicked");
@@ -24,12 +31,22 @@ const ImageToolsMenu = ({
});
}, [blockUid]);
+ const refreshSettings = useCallback((): void => {
+ setSettings(bulkReadSettings());
+ }, []);
+
const handleMenuClose = useCallback(() => {
setMenuKey((prev) => prev + 1);
}, []);
const trigger = (
-
+
);
return (
@@ -45,6 +62,7 @@ const ImageToolsMenu = ({
extensionAPI={extensionAPI}
trigger={trigger}
isShift={false}
+ settingsSnapshot={settings}
/>