Skip to content

Commit 04817c2

Browse files
authored
ENG-1790 Reduce repeated settings reads during page load (#1069)
1 parent abc8e23 commit 04817c2

6 files changed

Lines changed: 72 additions & 9 deletions

File tree

apps/roam/src/components/DiscourseNodeMenu.tsx

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,10 @@ import { getNewDiscourseNodeText } from "~/utils/formatUtils";
2727
import { OnloadArgs } from "roamjs-components/types";
2828
import { formatHexColor } from "./settings/DiscourseNodeCanvasSettings";
2929
import posthog from "posthog-js";
30-
import { setPersonalSetting } from "~/components/settings/utils/accessors";
30+
import {
31+
setPersonalSetting,
32+
type SettingsSnapshot,
33+
} from "~/components/settings/utils/accessors";
3134
import { PERSONAL_KEYS } from "~/components/settings/utils/settingKeys";
3235
import type { PersonalSettings } from "~/components/settings/utils/zodSchema";
3336

@@ -38,6 +41,7 @@ type Props = {
3841
trigger?: JSX.Element;
3942
isShift?: boolean;
4043
menuMaxHeight?: number;
44+
settingsSnapshot?: SettingsSnapshot;
4145
};
4246

4347
const NodeMenu = ({
@@ -48,6 +52,7 @@ const NodeMenu = ({
4852
trigger,
4953
isShift,
5054
menuMaxHeight,
55+
settingsSnapshot,
5156
}: { onClose: () => void } & Props) => {
5257
const isInitialTextSelected =
5358
!!textarea && textarea.selectionStart !== textarea.selectionEnd;
@@ -56,8 +61,11 @@ const NodeMenu = ({
5661
isInitialTextSelected || (isShift ?? false),
5762
);
5863
const userDiscourseNodes = useMemo(
59-
() => getDiscourseNodes().filter((n) => n.backedBy === "user"),
60-
[],
64+
() =>
65+
getDiscourseNodes(undefined, settingsSnapshot).filter(
66+
(n) => n.backedBy === "user",
67+
),
68+
[settingsSnapshot],
6169
);
6270
const discourseNodes = userDiscourseNodes.filter(
6371
(n) => showNodeTypes || n.tag,
@@ -359,10 +367,12 @@ export const TextSelectionNodeMenu = ({
359367
textarea,
360368
extensionAPI,
361369
onClose,
370+
settingsSnapshot,
362371
}: {
363372
textarea: HTMLTextAreaElement;
364373
extensionAPI: OnloadArgs["extensionAPI"];
365374
onClose: () => void;
375+
settingsSnapshot?: SettingsSnapshot;
366376
}) => {
367377
const trigger = (
368378
<Button
@@ -403,6 +413,7 @@ export const TextSelectionNodeMenu = ({
403413
onClose={onClose}
404414
isShift
405415
menuMaxHeight={menuMaxHeight}
416+
settingsSnapshot={settingsSnapshot}
406417
/>
407418
);
408419
};

apps/roam/src/utils/getExportTypes.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ import {
2121
pullBlockToTreeNode,
2222
collectUids,
2323
} from "./exportUtils";
24+
import {
25+
bulkReadSettings,
26+
type SettingsSnapshot,
27+
} from "~/components/settings/utils/accessors";
2428

2529
export const updateExportProgress = (detail: {
2630
progress: number;
@@ -36,6 +40,7 @@ type getExportTypesProps = {
3640
results?: ExportDialogProps["results"];
3741
exportId: string;
3842
isExportDiscourseGraph: boolean;
43+
settingsSnapshot?: SettingsSnapshot;
3944
};
4045

4146
type RoamImportUser = {
@@ -66,9 +71,11 @@ const getExportTypes = ({
6671
results,
6772
exportId,
6873
isExportDiscourseGraph,
74+
settingsSnapshot,
6975
}: getExportTypesProps): ExportTypes => {
70-
const allRelations = getDiscourseRelations();
71-
const allNodes = getDiscourseNodes(allRelations);
76+
const settings = settingsSnapshot ?? bulkReadSettings();
77+
const allRelations = getDiscourseRelations(settings);
78+
const allNodes = getDiscourseNodes(allRelations, settings);
7279
const nodeLabelByType = Object.fromEntries(
7380
allNodes.map((a) => [a.type, a.text]),
7481
);

apps/roam/src/utils/initializeObserversAndListeners.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ export const initObservers = ({
229229
className: "rm-inline-img",
230230
callback: (img: HTMLElement) => {
231231
if (img instanceof HTMLImageElement) {
232-
renderImageToolsMenu(img, onloadArgs.extensionAPI);
232+
renderImageToolsMenu(img, onloadArgs.extensionAPI, settings);
233233
}
234234
},
235235
});
@@ -443,6 +443,7 @@ export const initObservers = ({
443443
extensionAPI: onloadArgs.extensionAPI,
444444
blockElement,
445445
textarea,
446+
settingsSnapshot: settings,
446447
});
447448
} else {
448449
removeTextSelectionPopup();

apps/roam/src/utils/pageRefObserverHandlers.ts

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,10 @@ import { OnloadArgs } from "roamjs-components/types";
66
import { renderSuggestive as renderSuggestiveOverlay } from "~/components/SuggestiveModeOverlay";
77
import getDiscourseNodes, { type DiscourseNode } from "./getDiscourseNodes";
88
import findDiscourseNode from "./findDiscourseNode";
9+
import {
10+
bulkReadSettings,
11+
type SettingsSnapshot,
12+
} from "~/components/settings/utils/accessors";
913

1014
const PAGE_REF_SELECTOR = "span.rm-page-ref";
1115
const DISCOURSE_OVERLAY_CLASS = "roamjs-discourse-context-overlay";
@@ -24,11 +28,13 @@ type PageRefDiscourseNodeStatus = {
2428
};
2529

2630
let batchDiscourseNodes: DiscourseNode[] | null = null;
31+
let batchSettingsSnapshot: SettingsSnapshot | null = null;
2732
let clearBatchCacheQueued = false;
2833
const pageRefDiscourseNodeCache = new Map<string, PageRefDiscourseNodeStatus>();
2934

3035
const clearBatchCache = (): void => {
3136
batchDiscourseNodes = null;
37+
batchSettingsSnapshot = null;
3238
pageRefDiscourseNodeCache.clear();
3339
clearBatchCacheQueued = false;
3440
};
@@ -39,10 +45,21 @@ const queueBatchCacheClear = (): void => {
3945
queueMicrotask(clearBatchCache);
4046
};
4147

48+
const getBatchSettingsSnapshot = (): SettingsSnapshot => {
49+
if (batchSettingsSnapshot) return batchSettingsSnapshot;
50+
51+
batchSettingsSnapshot = bulkReadSettings();
52+
queueBatchCacheClear();
53+
return batchSettingsSnapshot;
54+
};
55+
4256
const getBatchDiscourseNodes = (): DiscourseNode[] => {
4357
if (batchDiscourseNodes) return batchDiscourseNodes;
4458

45-
batchDiscourseNodes = getDiscourseNodes();
59+
batchDiscourseNodes = getDiscourseNodes(
60+
undefined,
61+
getBatchSettingsSnapshot(),
62+
);
4663
queueBatchCacheClear();
4764
return batchDiscourseNodes;
4865
};

apps/roam/src/utils/renderImageToolsMenu.tsx

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,24 @@ import getUids from "roamjs-components/dom/getUids";
55
import NodeMenu from "~/components/DiscourseNodeMenu";
66
import { OnloadArgs } from "roamjs-components/types";
77
import posthog from "posthog-js";
8+
import {
9+
bulkReadSettings,
10+
type SettingsSnapshot,
11+
} from "~/components/settings/utils/accessors";
812

913
type ImageToolsMenuProps = {
1014
blockUid: string;
1115
extensionAPI: OnloadArgs["extensionAPI"];
16+
initialSettings: SettingsSnapshot;
1217
};
1318

1419
const ImageToolsMenu = ({
1520
blockUid,
1621
extensionAPI,
22+
initialSettings,
1723
}: ImageToolsMenuProps): JSX.Element => {
1824
const [menuKey, setMenuKey] = useState(0);
25+
const [settings, setSettings] = useState(initialSettings);
1926

2027
const handleEditBlock = useCallback((): void => {
2128
posthog.capture("Image Tools Menu: Edit Block Clicked");
@@ -24,12 +31,22 @@ const ImageToolsMenu = ({
2431
});
2532
}, [blockUid]);
2633

34+
const refreshSettings = useCallback((): void => {
35+
setSettings(bulkReadSettings());
36+
}, []);
37+
2738
const handleMenuClose = useCallback(() => {
2839
setMenuKey((prev) => prev + 1);
2940
}, []);
3041

3142
const trigger = (
32-
<Button icon={"label" as IconName} minimal small title="Add Node Tag" />
43+
<Button
44+
icon={"label" as IconName}
45+
minimal
46+
small
47+
title="Add Node Tag"
48+
onMouseDown={refreshSettings}
49+
/>
3350
);
3451

3552
return (
@@ -45,6 +62,7 @@ const ImageToolsMenu = ({
4562
extensionAPI={extensionAPI}
4663
trigger={trigger}
4764
isShift={false}
65+
settingsSnapshot={settings}
4866
/>
4967

5068
<Button
@@ -125,6 +143,7 @@ const attachHoverListeners = (
125143
export const renderImageToolsMenu = (
126144
imageElement: HTMLImageElement,
127145
extensionAPI: OnloadArgs["extensionAPI"],
146+
initialSettings: SettingsSnapshot,
128147
): void => {
129148
const wrapper = getImageWrapper(imageElement);
130149
if (!wrapper) return;
@@ -142,7 +161,11 @@ export const renderImageToolsMenu = (
142161

143162
// eslint-disable-next-line react/no-deprecated
144163
ReactDOM.render(
145-
<ImageToolsMenu blockUid={blockUid} extensionAPI={extensionAPI} />,
164+
<ImageToolsMenu
165+
blockUid={blockUid}
166+
extensionAPI={extensionAPI}
167+
initialSettings={initialSettings}
168+
/>,
146169
menuContainer,
147170
);
148171
};

apps/roam/src/utils/renderTextSelectionPopup.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { TextSelectionNodeMenu } from "~/components/DiscourseNodeMenu";
44
import { getCoordsFromTextarea } from "roamjs-components/components/CursorMenu";
55
import { OnloadArgs } from "roamjs-components/types";
66
import posthog from "posthog-js";
7+
import type { SettingsSnapshot } from "~/components/settings/utils/accessors";
78

89
let currentPopupContainer: HTMLDivElement | null = null;
910

@@ -44,10 +45,12 @@ export const renderTextSelectionPopup = ({
4445
extensionAPI,
4546
blockElement,
4647
textarea,
48+
settingsSnapshot,
4749
}: {
4850
extensionAPI: OnloadArgs["extensionAPI"];
4951
blockElement: Element;
5052
textarea: HTMLTextAreaElement;
53+
settingsSnapshot: SettingsSnapshot;
5154
}) => {
5255
posthog.capture("Text Selection Popup: Opened");
5356
removeTextSelectionPopup();
@@ -66,6 +69,7 @@ export const renderTextSelectionPopup = ({
6669
textarea={textarea}
6770
extensionAPI={extensionAPI}
6871
onClose={removeTextSelectionPopup}
72+
settingsSnapshot={settingsSnapshot}
6973
/>,
7074
currentPopupContainer,
7175
);

0 commit comments

Comments
 (0)