chore: refactor

This commit is contained in:
Jack Wotherspoon
2026-02-16 15:35:41 -05:00
committed by Keith Guerin
parent 4412314dbe
commit f40f475024
2 changed files with 27 additions and 46 deletions

View File

@@ -110,3 +110,23 @@ export function deriveItemsFromLegacySettings(
return items;
}
const VALID_IDS: Set<string> = 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<string>;
} {
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),
};
}

View File

@@ -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<FooterConfigDialogProps> = ({
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<string>;
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<FooterConfigDialogProps> = ({
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,
},