Skip to content

Commit 1f5f70f

Browse files
feat(ui): clean up picker compact view default state handling
- Name it `pickerCompactViewStates` bc its not exclusive to model picker, it is used for all pickers - Rename redux action to model an event - Move selector to right file - Use selector to derive state for individual picker
1 parent 1430858 commit 1f5f70f

File tree

4 files changed

+19
-11
lines changed

4 files changed

+19
-11
lines changed

invokeai/frontend/web/src/common/components/Picker/Picker.tsx

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,11 +11,13 @@ import {
1111
Text,
1212
} from '@invoke-ai/ui-library';
1313
import { useStore } from '@nanostores/react';
14+
import { createSelector } from '@reduxjs/toolkit';
1415
import { useAppDispatch, useAppSelector } from 'app/store/storeHooks';
1516
import ScrollableContent from 'common/components/OverlayScrollbars/ScrollableContent';
1617
import { typedMemo } from 'common/util/typedMemo';
1718
import { NO_DRAG_CLASS, NO_WHEEL_CLASS } from 'features/nodes/types/constants';
18-
import { selectModelPickerCompactViewStates, setModelPickerCompactView } from 'features/ui/store/uiSlice';
19+
import { selectPickerCompactViewStates } from 'features/ui/store/uiSelectors';
20+
import { pickerCompactViewStateChanged } from 'features/ui/store/uiSlice';
1921
import type { AnyStore, ReadableAtom, Task, WritableAtom } from 'nanostores';
2022
import { atom, computed } from 'nanostores';
2123
import type { StoreValues } from 'nanostores/computed';
@@ -210,6 +212,14 @@ type PickerProps<T extends object> = {
210212
initialGroupStates?: GroupStatusMap;
211213
};
212214

215+
const buildSelectIsCompactView = (pickerId?: string) =>
216+
createSelector([selectPickerCompactViewStates], (compactViewStates) => {
217+
if (!pickerId) {
218+
return true;
219+
}
220+
return compactViewStates[pickerId] ?? true;
221+
});
222+
213223
export type PickerContextState<T extends object> = {
214224
$optionsOrGroups: WritableAtom<OptionOrGroup<T>[]>;
215225
$groupStatusMap: WritableAtom<GroupStatusMap>;
@@ -529,7 +539,6 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
529539
} = props;
530540
const rootRef = useRef<HTMLDivElement>(null);
531541
const inputRef = useRef<HTMLInputElement>(null);
532-
const compactViewStates = useAppSelector(selectModelPickerCompactViewStates);
533542

534543
const { $groupStatusMap, $areAllGroupsDisabled, toggleGroup } = useTogglableGroups(
535544
optionsOrGroups,
@@ -547,8 +556,8 @@ export const Picker = typedMemo(<T extends object>(props: PickerProps<T>) => {
547556
const $searchTerm = useAtom('');
548557
const $selectedItemId = useComputed([$selectedItem], (item) => (item ? getOptionId(item) : undefined));
549558

550-
// Use Redux state for compact view, defaulting to true if no pickerId or no saved state
551-
const isCompactView = pickerId ? (compactViewStates[pickerId] ?? true) : true;
559+
const selectIsCompactView = useMemo(() => buildSelectIsCompactView(pickerId), [pickerId]);
560+
const isCompactView = useAppSelector(selectIsCompactView);
552561

553562
const onSelectById = useCallback(
554563
(id: string) => {
@@ -888,7 +897,7 @@ const CompactViewToggleButton = typedMemo(<T extends object>() => {
888897

889898
const onClick = useCallback(() => {
890899
if (pickerId) {
891-
dispatch(setModelPickerCompactView({ pickerId, isCompact: !isCompactView }));
900+
dispatch(pickerCompactViewStateChanged({ pickerId, isCompact: !isCompactView }));
892901
}
893902
}, [dispatch, pickerId, isCompactView]);
894903

invokeai/frontend/web/src/features/ui/store/uiSelectors.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,3 +4,4 @@ import { selectUiSlice } from 'features/ui/store/uiSlice';
44
export const selectActiveTab = createSelector(selectUiSlice, (ui) => ui.activeTab);
55
export const selectShouldShowImageDetails = createSelector(selectUiSlice, (ui) => ui.shouldShowImageDetails);
66
export const selectShouldShowProgressInViewer = createSelector(selectUiSlice, (ui) => ui.shouldShowProgressInViewer);
7+
export const selectPickerCompactViewStates = createSelector(selectUiSlice, (ui) => ui.pickerCompactViewStates);

invokeai/frontend/web/src/features/ui/store/uiSlice.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,8 @@ export const uiSlice = createSlice({
6565
shouldShowNotificationChanged: (state, action: PayloadAction<UIState['shouldShowNotificationV2']>) => {
6666
state.shouldShowNotificationV2 = action.payload;
6767
},
68-
setModelPickerCompactView: (state, action: PayloadAction<{ pickerId: string; isCompact: boolean }>) => {
69-
state.modelPickerCompactViewStates[action.payload.pickerId] = action.payload.isCompact;
68+
pickerCompactViewStateChanged: (state, action: PayloadAction<{ pickerId: string; isCompact: boolean }>) => {
69+
state.pickerCompactViewStates[action.payload.pickerId] = action.payload.isCompact;
7070
},
7171
},
7272
});
@@ -80,13 +80,11 @@ export const {
8080
shouldShowNotificationChanged,
8181
textAreaSizesStateChanged,
8282
dockviewStorageKeyChanged,
83-
setModelPickerCompactView,
83+
pickerCompactViewStateChanged,
8484
} = uiSlice.actions;
8585

8686
export const selectUiSlice = (state: RootState) => state.ui;
8787

88-
export const selectModelPickerCompactViewStates = (state: RootState) => state.ui.modelPickerCompactViewStates;
89-
9088
/* eslint-disable-next-line @typescript-eslint/no-explicit-any */
9189
const migrateUIState = (state: any): any => {
9290
if (!('_version' in state)) {

invokeai/frontend/web/src/features/ui/store/uiTypes.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ const zUIState = z.object({
2323
textAreaSizes: z.record(z.string(), zPartialDimensions).default({}),
2424
panels: z.record(z.string(), zSerializable).default({}),
2525
shouldShowNotificationV2: z.boolean().default(true),
26-
modelPickerCompactViewStates: z.record(z.string(), z.boolean()).default(() => ({})),
26+
pickerCompactViewStates: z.record(z.string(), z.boolean()).default(() => ({})),
2727
});
2828
const INITIAL_STATE = zUIState.parse({});
2929
export type UIState = z.infer<typeof zUIState>;

0 commit comments

Comments
 (0)