Skip to content

Commit 3b4c80a

Browse files
committed
ENG-1468: Port node and relations tree based consumers (#825)
* Rebase ENG-1468 onto eng-1472 (fresh redo) * Remove unnecessary lazy initializer from complement useState * Break circular dep: inline DISCOURSE_CONFIG_PAGE_TITLE * Address review: case-insensitive attribute lookup, empty-string fallback, move DISCOURSE_CONFIG_PAGE_TITLE to data/constants
1 parent 0bc1d22 commit 3b4c80a

File tree

9 files changed

+84
-55
lines changed

9 files changed

+84
-55
lines changed

apps/roam/src/components/DiscourseContextOverlay.tsx

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,7 @@ import { ContextContent } from "./DiscourseContext";
1212
import useInViewport from "react-in-viewport/dist/es/lib/useInViewport";
1313
import normalizePageTitle from "roamjs-components/queries/normalizePageTitle";
1414
import deriveDiscourseNodeAttribute from "~/utils/deriveDiscourseNodeAttribute";
15-
import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree";
16-
import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByParentUid";
15+
import { getDiscourseNodeSetting } from "~/components/settings/utils/accessors";
1716
import nanoid from "nanoid";
1817
import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle";
1918
import getDiscourseContextResults from "~/utils/getDiscourseContextResults";
@@ -180,11 +179,10 @@ const useDiscourseContext = (uid: string, tag: string) => {
180179
.then(({ refs, results }) => {
181180
const discourseNode = findDiscourseNode({ uid: uid });
182181
if (discourseNode) {
183-
const attribute = getSettingValueFromTree({
184-
tree: getBasicTreeByParentUid(discourseNode.type),
185-
key: "Overlay",
186-
defaultValue: "Overlay",
187-
});
182+
const attribute =
183+
getDiscourseNodeSetting<string>(discourseNode.type, [
184+
"overlay",
185+
]) || "Overlay";
188186
return deriveDiscourseNodeAttribute({
189187
uid: uid,
190188
attribute,

apps/roam/src/components/settings/DiscourseNodeCanvasSettings.tsx

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,16 @@ import {
77
Icon,
88
ControlGroup,
99
} from "@blueprintjs/core";
10-
import React, { useState, useMemo } from "react";
11-
import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByParentUid";
12-
import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree";
10+
import React, { useState } from "react";
1311
import setInputSetting from "roamjs-components/util/setInputSetting";
1412
import {
1513
DiscourseNodeFlagPanel,
1614
DiscourseNodeTextPanel,
1715
} from "./components/BlockPropSettingPanels";
18-
import { setDiscourseNodeSetting } from "~/components/settings/utils/accessors";
16+
import {
17+
getDiscourseNodeSetting,
18+
setDiscourseNodeSetting,
19+
} from "~/components/settings/utils/accessors";
1920

2021
export const formatHexColor = (color: string) => {
2122
if (!color) return "";
@@ -36,20 +37,35 @@ const DiscourseNodeCanvasSettings = ({
3637
nodeType: string;
3738
uid: string;
3839
}) => {
39-
const tree = useMemo(() => getBasicTreeByParentUid(uid), [uid]);
4040
const [color, setColor] = useState<string>(() => {
41-
const color = getSettingValueFromTree({ tree, key: "color" });
41+
const color =
42+
getDiscourseNodeSetting<string>(nodeType, ["canvasSettings", "color"]) ??
43+
"";
4244
return formatHexColor(color);
4345
});
44-
const alias = getSettingValueFromTree({ tree, key: "alias" });
45-
const [queryBuilderAlias, setQueryBuilderAlias] = useState<string>(() =>
46-
getSettingValueFromTree({ tree, key: "query-builder-alias" }),
46+
const alias =
47+
getDiscourseNodeSetting<string>(nodeType, ["canvasSettings", "alias"]) ??
48+
"";
49+
const [queryBuilderAlias, setQueryBuilderAlias] = useState<string>(
50+
() =>
51+
getDiscourseNodeSetting<string>(nodeType, [
52+
"canvasSettings",
53+
"query-builder-alias",
54+
]) ?? "",
4755
);
4856
const [isKeyImage, setIsKeyImage] = useState(
49-
() => getSettingValueFromTree({ tree, key: "key-image" }) === "true",
57+
() =>
58+
getDiscourseNodeSetting<boolean>(nodeType, [
59+
"canvasSettings",
60+
"key-image",
61+
]) ?? false,
5062
);
51-
const [keyImageOption, setKeyImageOption] = useState(() =>
52-
getSettingValueFromTree({ tree, key: "key-image-option" }),
63+
const [keyImageOption, setKeyImageOption] = useState(
64+
() =>
65+
getDiscourseNodeSetting<string>(nodeType, [
66+
"canvasSettings",
67+
"key-image-option",
68+
]) ?? "",
5369
);
5470

5571
return (

apps/roam/src/components/settings/DiscourseNodeSpecification.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ import getDiscourseNodes from "~/utils/getDiscourseNodes";
88
import getDiscourseNodeFormatExpression from "~/utils/getDiscourseNodeFormatExpression";
99
import QueryEditor from "~/components/QueryEditor";
1010
import internalError from "~/utils/internalError";
11-
import { setDiscourseNodeSetting } from "~/components/settings/utils/accessors";
11+
import {
12+
getDiscourseNodeSetting,
13+
setDiscourseNodeSetting,
14+
} from "~/components/settings/utils/accessors";
1215
import { DiscourseNodeFlagPanel } from "~/components/settings/components/BlockPropSettingPanels";
1316

1417
const NodeSpecification = ({
@@ -27,7 +30,13 @@ const NodeSpecification = ({
2730
?.uid,
2831
[parentUid],
2932
);
30-
const [enabled, setEnabled] = React.useState(!!enabledBlockUid);
33+
const [enabled, setEnabled] = React.useState(
34+
() =>
35+
getDiscourseNodeSetting<boolean>(node.type, [
36+
"specification",
37+
"enabled",
38+
]) ?? false,
39+
);
3140

3241
React.useEffect(() => {
3342
if (enabled) {

apps/roam/src/components/settings/DiscourseRelationConfigPanel.tsx

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ import type {
3232
RoamBasicNode,
3333
TreeNode,
3434
} from "roamjs-components/types";
35-
import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree";
3635
import MenuItemSelect from "roamjs-components/components/MenuItemSelect";
3736
import setInputSetting from "roamjs-components/util/setInputSetting";
3837
import toFlexRegex from "roamjs-components/util/toFlexRegex";
@@ -52,6 +51,7 @@ import posthog from "posthog-js";
5251
import { getSetting, setSetting } from "~/utils/extensionSettings";
5352
import {
5453
getFeatureFlag,
54+
getGlobalSetting,
5555
setGlobalSetting,
5656
getGlobalSettings,
5757
} from "~/components/settings/utils/accessors";
@@ -139,10 +139,11 @@ export const RelationEditPanel = ({
139139
const [tab, setTab] = useState(0);
140140
const initialSourceUid = useMemo(
141141
() =>
142-
getSettingValueFromTree({
143-
tree: editingRelationInfo.children,
144-
key: "source",
145-
}),
142+
getGlobalSetting<string>([
143+
"Relations",
144+
editingRelationInfo.uid,
145+
"source",
146+
]) ?? "",
146147
[],
147148
);
148149
const initialSource = useMemo(
@@ -152,10 +153,11 @@ export const RelationEditPanel = ({
152153
const [source, setSource] = useState(initialSourceUid);
153154
const initialDestinationUid = useMemo(
154155
() =>
155-
getSettingValueFromTree({
156-
tree: editingRelationInfo.children,
157-
key: "destination",
158-
}),
156+
getGlobalSetting<string>([
157+
"Relations",
158+
editingRelationInfo.uid,
159+
"destination",
160+
]) ?? "",
159161
[],
160162
);
161163
const initialDestination = useMemo(
@@ -165,10 +167,11 @@ export const RelationEditPanel = ({
165167
const [destination, setDestination] = useState(initialDestinationUid);
166168
const [label, setLabel] = useState(editingRelationInfo.text);
167169
const [complement, setComplement] = useState(
168-
getSettingValueFromTree({
169-
tree: editingRelationInfo.children,
170-
key: "complement",
171-
}),
170+
getGlobalSetting<string>([
171+
"Relations",
172+
editingRelationInfo.uid,
173+
"complement",
174+
]) ?? "",
172175
);
173176

174177
const edgeCallback = useCallback(

apps/roam/src/components/settings/NodeConfig.tsx

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import DiscourseNodeAttributes from "./DiscourseNodeAttributes";
99
import DiscourseNodeCanvasSettings from "./DiscourseNodeCanvasSettings";
1010
import DiscourseNodeIndex from "./DiscourseNodeIndex";
1111
import { OnloadArgs } from "roamjs-components/types";
12-
import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByParentUid";
12+
import { getDiscourseNodeSetting } from "~/components/settings/utils/accessors";
1313
import DiscourseNodeSuggestiveRules from "./DiscourseNodeSuggestiveRules";
1414
import { getFeatureFlag } from "~/components/settings/utils/accessors";
1515
import {
@@ -82,10 +82,11 @@ const NodeConfig = ({
8282
isSpecificationEnabled?: boolean;
8383
}) => {
8484
if (isSpecificationEnabled === undefined)
85-
isSpecificationEnabled = !!getSubTree({
86-
tree: getBasicTreeByParentUid(specificationUid),
87-
key: "enabled",
88-
})?.uid?.length;
85+
isSpecificationEnabled =
86+
getDiscourseNodeSetting<boolean>(node.type, [
87+
"specification",
88+
"enabled",
89+
]) ?? false;
8990
if (format.trim().length === 0 && !isSpecificationEnabled) {
9091
setTagError("");
9192
setFormatError("Error: you must set either a format or specification");
@@ -123,7 +124,7 @@ const NodeConfig = ({
123124
setFormatError("");
124125
}
125126
},
126-
[specificationUid],
127+
[node.type],
127128
);
128129

129130
useEffect(() => {
@@ -261,7 +262,9 @@ const NodeConfig = ({
261262
description="Select which attribute is used for the discourse overlay"
262263
settingKeys={["overlay"]}
263264
options={attributeNode.children.map((c) => c.text)}
264-
initialValue={getBasicTreeByParentUid(overlayUid)[0]?.text}
265+
initialValue={
266+
getDiscourseNodeSetting<string>(node.type, ["overlay"]) ?? ""
267+
}
265268
order={0}
266269
parentUid={node.type}
267270
uid={overlayUid}

apps/roam/src/data/constants.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export const DISCOURSE_CONFIG_PAGE_TITLE = "roam/js/discourse-graph";

apps/roam/src/utils/deriveDiscourseNodeAttribute.ts

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
1-
import getSubTree from "roamjs-components/util/getSubTree";
2-
import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByParentUid";
3-
import getSettingValueFromTree from "roamjs-components/util/getSettingValueFromTree";
41
import getAttributeValueByBlockAndName from "roamjs-components/queries/getAttributeValueByBlockAndName";
2+
import { getDiscourseNodeSetting } from "~/components/settings/utils/accessors";
53
import getDiscourseContextResults from "./getDiscourseContextResults";
64
import findDiscourseNode from "./findDiscourseNode";
75
import getDiscourseNodes from "./getDiscourseNodes";
@@ -52,15 +50,16 @@ const deriveNodeAttribute = async ({
5250
const discourseNode = findDiscourseNode({ uid, nodes });
5351
if (!discourseNode) return 0;
5452
const nodeType = discourseNode.type;
55-
const attributeNode = getSubTree({
56-
tree: getBasicTreeByParentUid(nodeType || ""),
57-
key: "Attributes",
58-
});
59-
const scoreFormula = getSettingValueFromTree({
60-
tree: attributeNode.children,
61-
key: attribute,
62-
defaultValue: "{count:Has Any Relation To:any}",
63-
});
53+
const attributes =
54+
getDiscourseNodeSetting<Record<string, string>>(nodeType || "", [
55+
"attributes",
56+
]) ?? {};
57+
const match = Object.keys(attributes).find(
58+
(k) => k.toLowerCase() === attribute.toLowerCase(),
59+
);
60+
const scoreFormula =
61+
(match ? attributes[match] : undefined) ||
62+
"{count:Has Any Relation To:any}";
6463
let postProcess = scoreFormula;
6564
let totalOffset = 0;
6665
const matches = scoreFormula.matchAll(/{([^}]+)}/g);

apps/roam/src/utils/discourseConfigRef.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
getUidAndBooleanSetting,
88
BooleanSetting,
99
} from "./getExportSettings";
10-
import { DISCOURSE_CONFIG_PAGE_TITLE } from "~/utils/renderNodeConfigPage";
10+
import { DISCOURSE_CONFIG_PAGE_TITLE } from "~/data/constants";
1111
import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle";
1212
import {
1313
getSuggestiveModeConfigAndUids,

apps/roam/src/utils/getExportSettings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import getBasicTreeByParentUid from "roamjs-components/queries/getBasicTreeByPar
22
import getPageUidByPageTitle from "roamjs-components/queries/getPageUidByPageTitle";
33
import { RoamBasicNode } from "roamjs-components/types";
44
import { getSubTree } from "roamjs-components/util";
5-
import { DISCOURSE_CONFIG_PAGE_TITLE } from "~/utils/renderNodeConfigPage";
5+
import { DISCOURSE_CONFIG_PAGE_TITLE } from "~/data/constants";
66

77
type UidPair<T> = {
88
uid?: string;

0 commit comments

Comments
 (0)