diff --git a/packages/cli/src/config/footerItems.ts b/packages/cli/src/config/footerItems.ts index a0752de4e2..a9132dc30f 100644 --- a/packages/cli/src/config/footerItems.ts +++ b/packages/cli/src/config/footerItems.ts @@ -110,3 +110,23 @@ export function deriveItemsFromLegacySettings( return items; } + +const VALID_IDS: Set = new Set(ALL_ITEMS.map((i) => i.id)); + +/** + * Resolves the ordered list and selected set of footer items from settings. + * Used by FooterConfigDialog to initialize and reset state. + */ +export function resolveFooterState(settings: MergedSettings): { + orderedIds: string[]; + selectedIds: Set; +} { + const source = ( + settings.ui?.footer?.items ?? deriveItemsFromLegacySettings(settings) + ).filter((id: string) => VALID_IDS.has(id)); + const others = DEFAULT_ORDER.filter((id) => !source.includes(id)); + return { + orderedIds: [...source, ...others], + selectedIds: new Set(source), + }; +} diff --git a/packages/cli/src/ui/components/FooterConfigDialog.tsx b/packages/cli/src/ui/components/FooterConfigDialog.tsx index d2e779487a..d4502f210b 100644 --- a/packages/cli/src/ui/components/FooterConfigDialog.tsx +++ b/packages/cli/src/ui/components/FooterConfigDialog.tsx @@ -15,11 +15,7 @@ import { TextInput } from './shared/TextInput.js'; import { useFuzzyList } from '../hooks/useFuzzyList.js'; import { MemoryUsageDisplay } from './MemoryUsageDisplay.js'; import { FooterRow, type FooterRowItem } from './Footer.js'; -import { - ALL_ITEMS, - DEFAULT_ORDER, - deriveItemsFromLegacySettings, -} from '../../config/footerItems.js'; +import { ALL_ITEMS, resolveFooterState } from '../../config/footerItems.js'; import { SettingScope } from '../../config/settings.js'; interface FooterConfigDialogProps { @@ -139,38 +135,11 @@ export const FooterConfigDialog: React.FC = ({ const { settings, setSetting } = useSettingsStore(); const maxItemsToShow = 10; - const [state, dispatch] = useReducer(footerConfigReducer, undefined, () => { - const validIds = new Set(ALL_ITEMS.map((i: { id: string }) => i.id)); - let ordered: string[]; - let selected: Set; - - if (settings.merged.ui?.footer?.items) { - const savedItems = settings.merged.ui.footer.items.filter((id: string) => - validIds.has(id), - ); - const others = DEFAULT_ORDER.filter( - (id: string) => !savedItems.includes(id), - ); - ordered = [...savedItems, ...others]; - selected = new Set(savedItems); - } else { - const derived = deriveItemsFromLegacySettings(settings.merged).filter( - (id: string) => validIds.has(id), - ); - const others = DEFAULT_ORDER.filter( - (id: string) => !derived.includes(id), - ); - ordered = [...derived, ...others]; - selected = new Set(derived); - } - - return { - orderedIds: ordered, - selectedIds: selected, - activeIndex: 0, - scrollOffset: 0, - }; - }); + const [state, dispatch] = useReducer(footerConfigReducer, undefined, () => ({ + ...resolveFooterState(settings.merged), + activeIndex: 0, + scrollOffset: 0, + })); const { orderedIds, selectedIds, activeIndex, scrollOffset } = state; @@ -216,18 +185,10 @@ export const FooterConfigDialog: React.FC = ({ const handleResetToDefaults = useCallback(() => { setSetting(SettingScope.User, 'ui.footer.items', undefined); - - const validIds = new Set(ALL_ITEMS.map((i: { id: string }) => i.id)); - const derived = deriveItemsFromLegacySettings(settings.merged).filter( - (id: string) => validIds.has(id), - ); - const others = DEFAULT_ORDER.filter((id: string) => !derived.includes(id)); - dispatch({ type: 'SET_STATE', payload: { - orderedIds: [...derived, ...others], - selectedIds: new Set(derived), + ...resolveFooterState(settings.merged), activeIndex: 0, scrollOffset: 0, },