From 13394314cf69dce5557bdf6b1d57c38d3ddff00c Mon Sep 17 00:00:00 2001 From: sid597 Date: Mon, 23 Feb 2026 02:41:36 +0530 Subject: [PATCH 1/2] ENG-1472: Refactor BlockPropSettingPanels to add accessor-backed default reads (with initialValue fallback) --- .../components/BlockPropSettingPanels.tsx | 139 ++++++++++++++++-- 1 file changed, 125 insertions(+), 14 deletions(-) diff --git a/apps/roam/src/components/settings/components/BlockPropSettingPanels.tsx b/apps/roam/src/components/settings/components/BlockPropSettingPanels.tsx index 65d5225f5..ba9b26ce0 100644 --- a/apps/roam/src/components/settings/components/BlockPropSettingPanels.tsx +++ b/apps/roam/src/components/settings/components/BlockPropSettingPanels.tsx @@ -19,6 +19,10 @@ import Description from "roamjs-components/components/Description"; import useSingleChildValue from "roamjs-components/components/ConfigPanels/useSingleChildValue"; import getShallowTreeByParentUid from "roamjs-components/queries/getShallowTreeByParentUid"; import { + getGlobalSetting, + getPersonalSetting, + getFeatureFlag, + getDiscourseNodeSetting, setGlobalSetting, setPersonalSetting, setFeatureFlag, @@ -482,6 +486,18 @@ const createAccessors = ( setter: setFn, }); +const readWithFallback = ( + reader: () => T | undefined, + fallback?: T, +): T | undefined => { + try { + const value = reader(); + return value ?? fallback; + } catch { + return fallback; + } +}; + const globalAccessors = { text: createAccessors(setGlobalSetting), flag: createAccessors(setGlobalSetting), @@ -531,7 +547,7 @@ export const FeatureFlagPanel = ({ description={description} settingKeys={[featureKey as string]} setter={featureFlagSetter} - initialValue={initialValue} + initialValue={readWithFallback(() => getFeatureFlag(featureKey), initialValue)} onBeforeChange={handleBeforeChange} onChange={onAfterChange} parentUid={parentUid} @@ -542,31 +558,80 @@ export const FeatureFlagPanel = ({ }; export const GlobalTextPanel = (props: TextWrapperProps) => ( - + getGlobalSetting(props.settingKeys), + props.initialValue, + )} + {...globalAccessors.text} + /> ); export const GlobalFlagPanel = (props: FlagWrapperProps) => ( - + getGlobalSetting(props.settingKeys), + props.initialValue, + )} + {...globalAccessors.flag} + /> ); export const GlobalNumberPanel = (props: NumberWrapperProps) => ( - + getGlobalSetting(props.settingKeys), + props.initialValue, + )} + {...globalAccessors.number} + /> ); export const GlobalSelectPanel = (props: SelectWrapperProps) => ( - + getGlobalSetting(props.settingKeys), + props.initialValue, + )} + {...globalAccessors.text} + /> ); export const GlobalMultiTextPanel = (props: MultiTextWrapperProps) => ( - + getGlobalSetting(props.settingKeys), + props.initialValue, + )} + {...globalAccessors.multiText} + /> ); export const PersonalTextPanel = ({ setter, ...props }: TextWrapperProps) => ( - + getPersonalSetting(props.settingKeys), + props.initialValue, + )} + setter={setter ?? personalAccessors.text.setter} + /> ); export const PersonalFlagPanel = (props: FlagWrapperProps) => ( - + getPersonalSetting(props.settingKeys), + props.initialValue, + )} + {...personalAccessors.flag} + /> ); export const PersonalNumberPanel = ({ @@ -575,16 +640,34 @@ export const PersonalNumberPanel = ({ }: NumberWrapperProps) => ( getPersonalSetting(props.settingKeys), + props.initialValue, + )} setter={setter ?? personalAccessors.number.setter} /> ); export const PersonalSelectPanel = (props: SelectWrapperProps) => ( - + getPersonalSetting(props.settingKeys), + props.initialValue, + )} + {...personalAccessors.text} + /> ); export const PersonalMultiTextPanel = (props: MultiTextWrapperProps) => ( - + getPersonalSetting(props.settingKeys), + props.initialValue, + )} + {...personalAccessors.multiText} + /> ); const createDiscourseNodeSetter = @@ -610,7 +693,14 @@ export const DiscourseNodeTextPanel = ({ error?: string; onChange?: (value: string) => void; }) => ( - + getDiscourseNodeSetting(nodeType, props.settingKeys), + props.initialValue, + )} + setter={createDiscourseNodeSetter(nodeType)} + /> ); export const DiscourseNodeFlagPanel = ({ @@ -623,7 +713,14 @@ export const DiscourseNodeFlagPanel = ({ onBeforeChange?: (checked: boolean) => Promise; onChange?: (checked: boolean) => void; }) => ( - + getDiscourseNodeSetting(nodeType, props.settingKeys), + props.initialValue, + )} + setter={createDiscourseNodeSetter(nodeType)} + /> ); export const DiscourseNodeSelectPanel = ({ @@ -631,7 +728,14 @@ export const DiscourseNodeSelectPanel = ({ ...props }: DiscourseNodeBaseProps & RoamBlockSyncProps & { options: string[]; initialValue?: string }) => ( - + getDiscourseNodeSetting(nodeType, props.settingKeys), + props.initialValue, + )} + setter={createDiscourseNodeSetter(nodeType)} + /> ); export const DiscourseNodeNumberPanel = ({ @@ -643,5 +747,12 @@ export const DiscourseNodeNumberPanel = ({ min?: number; max?: number; }) => ( - + getDiscourseNodeSetting(nodeType, props.settingKeys), + props.initialValue, + )} + setter={createDiscourseNodeSetter(nodeType)} + /> ); From fe4caa1604906de6bf5264c4151b8bfe9d14a74a Mon Sep 17 00:00:00 2001 From: sid597 Date: Wed, 25 Feb 2026 15:54:51 +0530 Subject: [PATCH 2/2] review, fix --- .../src/components/settings/AdminPanel.tsx | 2 - .../components/settings/GeneralSettings.tsx | 1 - .../components/BlockPropSettingPanels.tsx | 118 +++++++----------- 3 files changed, 47 insertions(+), 74 deletions(-) diff --git a/apps/roam/src/components/settings/AdminPanel.tsx b/apps/roam/src/components/settings/AdminPanel.tsx index e9ad85d87..481e13259 100644 --- a/apps/roam/src/components/settings/AdminPanel.tsx +++ b/apps/roam/src/components/settings/AdminPanel.tsx @@ -40,7 +40,6 @@ import { USE_REIFIED_RELATIONS } from "~/data/userSettings"; import posthog from "posthog-js"; import { setFeatureFlag } from "~/components/settings/utils/accessors"; import { FeatureFlagPanel } from "./components/BlockPropSettingPanels"; -import { getFeatureFlag } from "./utils/accessors"; const NodeRow = ({ node }: { node: PConceptFull }) => { return ( @@ -473,7 +472,6 @@ const FeatureFlagsTab = (): React.ReactElement => { title="Use new settings store" description="When enabled, accessor getters read from block props instead of the old system. Surfaces dual-write gaps during development." featureKey="Use new settings store" - initialValue={getFeatureFlag("Use new settings store")} />