Skip to content

Commit 047596d

Browse files
authored
Discourse Context Refactor (DiscourseGraphs#25)
* fireQuery logging * initial refactor, return fireQuery promises * initial streaming * debounce spinner * renderActiveTabPanelOnly * disable overlay (bump roamjs-components)
1 parent 6a7ffb5 commit 047596d

File tree

7 files changed

+297
-109
lines changed

7 files changed

+297
-109
lines changed

apps/roam/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
"react-draggable": "^4.4.5",
3333
"react-in-viewport": "^1.0.0-alpha.20",
3434
"react-vertical-timeline-component": "^3.5.2",
35-
"roamjs-components": "^0.83.4",
35+
"roamjs-components": "^0.84.0",
3636
"signia-react": "^0.1.1"
3737
},
3838
"overrides": {

apps/roam/src/components/DiscourseContext.tsx

Lines changed: 52 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import {
66
Tabs,
77
Tab,
88
Tooltip,
9+
Spinner,
910
} from "@blueprintjs/core";
1011
import React, {
1112
useCallback,
@@ -309,17 +310,38 @@ const ContextTab = ({
309310
};
310311

311312
export const ContextContent = ({ uid, results }: Props) => {
312-
const [rawQueryResults, setRawQueryResults] = useState(results || []);
313+
const [rawQueryResults, setRawQueryResults] = useState<
314+
Record<string, DiscourseContextResults[number]>
315+
>({});
313316
const queryResults = useMemo(
314-
() => rawQueryResults.filter((r) => !!Object.keys(r.results).length),
317+
() =>
318+
Object.values(rawQueryResults).filter(
319+
(r) => !!Object.keys(r.results).length,
320+
),
315321
[rawQueryResults],
316322
);
317323
const [loading, setLoading] = useState(true);
324+
const debouncedLoading = useDebounce(loading, 150);
325+
318326
const onRefresh = useCallback(() => {
319-
getDiscourseContextResults({ uid })
320-
.then(setRawQueryResults)
321-
.finally(() => setLoading(false));
322-
}, [uid, results, setRawQueryResults, setLoading]);
327+
setRawQueryResults({});
328+
getDiscourseContextResults({
329+
uid,
330+
onResult: (result) => {
331+
setRawQueryResults((prev) => ({
332+
...prev,
333+
[result.label]: {
334+
label: result.label,
335+
results: {
336+
...(prev[result.label]?.results || {}),
337+
...result.results,
338+
},
339+
},
340+
}));
341+
},
342+
}).finally(() => setLoading(false));
343+
}, [uid, setRawQueryResults, setLoading]);
344+
323345
useEffect(() => {
324346
if (!results) {
325347
onRefresh();
@@ -342,6 +364,7 @@ export const ContextContent = ({ uid, results }: Props) => {
342364
selectedTabId={tabId}
343365
onChange={(e) => setTabId(Number(e))}
344366
vertical
367+
renderActiveTabPanelOnly
345368
>
346369
{queryResults.map((r, i) => (
347370
<Tab
@@ -361,9 +384,14 @@ export const ContextContent = ({ uid, results }: Props) => {
361384
}
362385
/>
363386
))}
387+
{debouncedLoading && (
388+
<div className="text-muted-foreground m-auto flex items-center gap-2 text-sm">
389+
<Spinner />
390+
</div>
391+
)}
364392
</Tabs>
365393
</>
366-
) : loading ? (
394+
) : debouncedLoading && !results ? (
367395
<Tabs selectedTabId={0} onChange={() => {}} vertical>
368396
<Tab
369397
id={0}
@@ -412,4 +440,21 @@ const DiscourseContext = ({ uid }: Props) => {
412440
);
413441
};
414442

443+
// used here to prevent the loading spinner from flashing briefly when queries resolve quickly
444+
const useDebounce = <T,>(value: T, delay: number): T => {
445+
const [debouncedValue, setDebouncedValue] = useState<T>(value);
446+
447+
useEffect(() => {
448+
const timer = setTimeout(() => {
449+
setDebouncedValue(value);
450+
}, delay);
451+
452+
return () => {
453+
clearTimeout(timer);
454+
};
455+
}, [value, delay]);
456+
457+
return debouncedValue;
458+
};
459+
415460
export default DiscourseContext;

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@ const DiscourseGraphHome = ({
5050
/>
5151
<FlagPanel
5252
title="overlay"
53-
description="Whether or not to overlay discourse context information over node references"
53+
// description="Whether or not to overlay discourse context information over node references"
54+
description="Currently disabled. Being reworked."
5455
order={3}
5556
uid={settings.overlay.uid}
5657
parentUid={settings.grammarUid}
5758
value={settings.overlay.value || false}
59+
disabled={true}
5860
/>
5961
</div>
6062
<TextPanel

apps/roam/src/discourseGraphsMode.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,8 +222,10 @@ const initializeDiscourseGraphsMode = async (args: OnloadArgs) => {
222222
{
223223
title: "overlay",
224224
Panel: FlagPanel,
225-
description:
226-
"Whether to overlay discourse context information over node references",
225+
// description:
226+
// "Whether to overlay discourse context information over node references",
227+
description: "Currently disabled. Being reworked.",
228+
disabled: true,
227229
options: {
228230
onChange: (val) => {
229231
onPageRefObserverChange(overlayPageRefHandler)(val);
@@ -473,9 +475,9 @@ const initializeDiscourseGraphsMode = async (args: OnloadArgs) => {
473475
});
474476

475477
if (isFlagEnabled("preview")) pageRefObservers.add(previewPageRefHandler);
476-
if (isFlagEnabled("grammar.overlay")) {
477-
pageRefObservers.add(overlayPageRefHandler);
478-
}
478+
// if (isFlagEnabled("grammar.overlay")) {
479+
// pageRefObservers.add(overlayPageRefHandler);
480+
// }
479481
if (pageRefObservers.size) enablePageRefObserver();
480482

481483
const queryPages = args.extensionAPI.settings.get("query-pages");

apps/roam/src/utils/fireQuery.ts

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import predefinedSelections, {
1414
import { DEFAULT_RETURN_NODE } from "./parseQuery";
1515
import { DiscourseNode } from "./getDiscourseNodes";
1616
import { DiscourseRelation } from "./getDiscourseRelations";
17+
import nanoid from "nanoid";
1718

1819
export type QueryArgs = {
1920
returnNode?: string;
@@ -323,21 +324,33 @@ const fireQuery: FireQuery = async (_args) => {
323324
}
324325
: getDatalogQuery(args);
325326
try {
326-
if (getNodeEnv() === "development") {
327-
console.log("Query to Roam:");
328-
console.log(query);
327+
const nodeEnv = getNodeEnv();
328+
const queryId = nodeEnv === "development" ? nanoid(4) : "";
329+
330+
if (nodeEnv === "development") {
331+
console.groupCollapsed(`🔍 Roam Query - ${queryId}`);
332+
console.log("%c" + query, "color: #94a3b8; font-family: monospace;");
329333
if (inputs.length) console.log("Inputs:", ...inputs);
334+
console.time(`Query - ${queryId}`);
335+
console.groupEnd();
330336
}
331337

332338
//@ts-ignore - todo add async q to roamjs-components
333339
const queryResults = await window.roamAlphaAPI.data.async.q(
334340
query,
335341
...inputs,
336342
);
343+
344+
if (nodeEnv === "development") {
345+
console.timeEnd(`Query - ${queryId}`);
346+
console.groupEnd();
347+
}
348+
337349
return Promise.all(queryResults.map(formatResult));
338350
} catch (e) {
339-
console.error("Error from Roam:");
351+
console.group("🚨 Roam Query Error");
340352
console.error((e as Error).message);
353+
console.groupEnd();
341354
return [];
342355
}
343356
};

0 commit comments

Comments
 (0)