Skip to content

Commit 2fdb3de

Browse files
committed
ENG-1484: reactive suggestive mode flag, gate reload prompts on new settings store
1 parent d280bfd commit 2fdb3de

5 files changed

Lines changed: 54 additions & 22 deletions

File tree

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

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,12 @@ import { setSetting } from "~/utils/extensionSettings";
1818
import {
1919
getFeatureFlag,
2020
setFeatureFlag,
21+
isNewSettingsStoreEnabled,
2122
} from "~/components/settings/utils/accessors";
23+
import {
24+
onSettingChange,
25+
settingKeys,
26+
} from "~/components/settings/utils/settingsEmitter";
2227
import {
2328
getSupabaseContext,
2429
getLoggedInClient,
@@ -367,6 +372,7 @@ const FeatureFlagsTab = (): React.ReactElement => {
367372
);
368373
const [isAlertOpen, setIsAlertOpen] = useState(false);
369374
const [isInstructionOpen, setIsInstructionOpen] = useState(false);
375+
const isReactive = isNewSettingsStoreEnabled();
370376

371377
return (
372378
<div className="flex flex-col gap-4 p-4">
@@ -424,26 +430,30 @@ const FeatureFlagsTab = (): React.ReactElement => {
424430
<p>Are you sure you want to proceed?</p>
425431
</Alert>
426432

427-
{/* TODO(ENG-1484): Add pull watcher reactivity so toggling suggestive mode
428-
starts/stops sync and shows the tab without requiring a reload. */}
429433
<Alert
430434
isOpen={isInstructionOpen}
431-
onConfirm={() => window.location.reload()}
432-
onCancel={() => setIsInstructionOpen(false)}
433-
confirmButtonText="Reload Graph"
434-
cancelButtonText="Later"
435+
onConfirm={() =>
436+
isReactive
437+
? setIsInstructionOpen(false)
438+
: window.location.reload()
439+
}
440+
onCancel={isReactive ? undefined : () => setIsInstructionOpen(false)}
441+
confirmButtonText={isReactive ? "OK" : "Reload Graph"}
442+
cancelButtonText={isReactive ? undefined : "Later"}
435443
intent={Intent.PRIMARY}
436444
>
437445
<p>
438446
If this is the first time enabling it, you will need to generate and
439447
upload all node embeddings to supabase.
440448
</p>
449+
{!isReactive && (
450+
<p>
451+
Please reload the graph to see the new &apos;Suggestive Mode&apos;
452+
tab.
453+
</p>
454+
)}
441455
<p>
442-
Please reload the graph to see the new &apos;Suggestive Mode&apos;
443-
tab.
444-
</p>
445-
<p>
446-
Then go to Suggestive Mode{" "}
456+
Go to Suggestive Mode{" "}
447457
{"-> Sync Config -> Click on 'Generate & Upload All Node Embeddings'"}
448458
</p>
449459
</Alert>
@@ -500,6 +510,15 @@ const FeatureFlagsTab = (): React.ReactElement => {
500510

501511
const AdminPanel = (): React.ReactElement => {
502512
const [selectedTabId, setSelectedTabId] = useState<TabId>("admin");
513+
const [showSuggestiveTab, setShowSuggestiveTab] = useState(
514+
getFeatureFlag("Suggestive mode enabled"),
515+
);
516+
517+
useEffect(() => {
518+
return onSettingChange(settingKeys.suggestiveModeEnabled, (newValue) => {
519+
setShowSuggestiveTab(Boolean(newValue));
520+
});
521+
}, []);
503522

504523
return (
505524
<Tabs
@@ -534,7 +553,7 @@ const AdminPanel = (): React.ReactElement => {
534553
</div>
535554
}
536555
/>
537-
{getFeatureFlag("Suggestive mode enabled") && (
556+
{showSuggestiveTab && (
538557
<Tab
539558
id="suggestive-mode-settings"
540559
title="Suggestive mode"

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

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,10 @@ import { setSetting } from "~/utils/extensionSettings";
2626
import { enablePostHog, disablePostHog } from "~/utils/posthog";
2727
import KeyboardShortcutInput from "./KeyboardShortcutInput";
2828
import streamlineStyling from "~/styles/streamlineStyling";
29-
import { getFeatureFlag } from "~/components/settings/utils/accessors";
29+
import {
30+
getFeatureFlag,
31+
isNewSettingsStoreEnabled,
32+
} from "~/components/settings/utils/accessors";
3033
import { PersonalFlagPanel } from "./components/BlockPropSettingPanels";
3134
import posthog from "posthog-js";
3235

@@ -39,18 +42,14 @@ const HomePersonalSettings = ({ onloadArgs }: { onloadArgs: OnloadArgs }) => {
3942
<Label>
4043
Personal node menu trigger
4144
<Description
42-
description={
43-
"Override the global trigger for the discourse node menu. Must refresh after editing."
44-
}
45+
description={`Override the global trigger for the discourse node menu.${isNewSettingsStoreEnabled() ? "" : " Must refresh after editing."}`}
4546
/>
4647
<NodeMenuTriggerComponent extensionAPI={extensionAPI} />
4748
</Label>
4849
<Label>
4950
Node search menu trigger
5051
<Description
51-
description={
52-
"Set the trigger character for the node search menu. Must refresh after editing."
53-
}
52+
description={`Set the trigger character for the node search menu.${isNewSettingsStoreEnabled() ? "" : " Must refresh after editing."}`}
5453
/>
5554
<NodeSearchMenuTriggerSetting onloadArgs={onloadArgs} />
5655
</Label>

apps/roam/src/components/settings/utils/pullWatchers.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,9 @@ export const featureFlagHandlers: Partial<
9595
"Enable left sidebar": (newValue, oldValue) => {
9696
emitSettingChange(settingKeys.leftSidebarFlag, newValue, oldValue);
9797
},
98+
"Suggestive mode enabled": (newValue, oldValue) => {
99+
emitSettingChange(settingKeys.suggestiveModeEnabled, newValue, oldValue);
100+
},
98101
/* eslint-enable @typescript-eslint/naming-convention */
99102
};
100103

apps/roam/src/components/settings/utils/settingsEmitter.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ export const settingKeys = {
88
personalNodeMenuTrigger: "personal:Personal node menu trigger",
99
nodeSearchMenuTrigger: "personal:Node search menu trigger",
1010
personalSuggestiveModeOverlay: "personal:Suggestive mode overlay",
11+
suggestiveModeEnabled: "flag:Suggestive mode enabled",
1112
} as const;
1213

1314
const listeners = new Map<string, Set<SettingChangeCallback>>();

apps/roam/src/index.ts

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,21 @@ export default runExtension(async (onloadArgs) => {
120120
document.addEventListener("input", discourseNodeSearchTriggerListener);
121121
document.addEventListener("selectionchange", nodeCreationPopoverListener);
122122

123-
const isSuggestiveModeEnabled = getFeatureFlag("Suggestive mode enabled");
124-
125-
if (isSuggestiveModeEnabled) {
123+
if (getFeatureFlag("Suggestive mode enabled")) {
126124
initializeSupabaseSync();
127125
}
128126

127+
const unsubSuggestiveMode = onSettingChange(
128+
settingKeys.suggestiveModeEnabled,
129+
(newValue) => {
130+
if (newValue) {
131+
initializeSupabaseSync();
132+
} else {
133+
setSyncActivity(false);
134+
}
135+
},
136+
);
137+
129138
const { extensionAPI } = onloadArgs;
130139
window.roamjs.extension.queryBuilder = {
131140
runQuery: (parentUid: string) =>
@@ -195,6 +204,7 @@ export default runExtension(async (onloadArgs) => {
195204
observers: observers,
196205
unload: () => {
197206
unsubLeftSidebarFlag();
207+
unsubSuggestiveMode();
198208
cleanupPullWatchers();
199209
cleanups.forEach((fn) => fn());
200210
setSyncActivity(false);

0 commit comments

Comments
 (0)