Skip to content

Commit 373c3b7

Browse files
author
Attila Cseh
committed
selectors refactored
1 parent 7864224 commit 373c3b7

File tree

19 files changed

+67
-86
lines changed

19 files changed

+67
-86
lines changed

invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/modelSelected.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@ import { logger } from 'app/logging/logger';
22
import type { AppStartListening } from 'app/store/store';
33
import { modelChanged } from 'features/controlLayers/store/actions';
44
import { bboxSyncedToOptimalDimension, rgRefImageModelChanged } from 'features/controlLayers/store/canvasSlice';
5-
import {
6-
buildSelectIsStagingBySessionId,
7-
selectActiveCanvasStagingAreaSessionId,
8-
} from 'features/controlLayers/store/canvasStagingAreaSlice';
5+
import { selectActiveCanvasIsStaging } from 'features/controlLayers/store/canvasStagingAreaSlice';
96
import { loraIsEnabledChanged, selectAddedLoRAs } from 'features/controlLayers/store/lorasSlice';
107
import { selectActiveTabParams, syncedToOptimalDimension, vaeSelected } from 'features/controlLayers/store/paramsSlice';
118
import { refImageModelChanged, selectReferenceImageEntities } from 'features/controlLayers/store/refImagesSlice';
@@ -165,9 +162,7 @@ export const addModelSelectedListener = (startAppListening: AppStartListening) =
165162
if (modelBase !== params.model?.base) {
166163
// Sync generate tab settings whenever the model base changes
167164
dispatch(syncedToOptimalDimension());
168-
const sessionId = selectActiveCanvasStagingAreaSessionId(state);
169-
const selectIsStaging = buildSelectIsStagingBySessionId(sessionId);
170-
const isStaging = selectIsStaging(state);
165+
const isStaging = selectActiveCanvasIsStaging(state);
171166
if (!isStaging) {
172167
// Canvas tab only syncs if not staging
173168
dispatch(bboxSyncedToOptimalDimension());

invokeai/frontend/web/src/app/store/middleware/listenerMiddleware/listeners/setDefaultSettings.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import type { AppStartListening } from 'app/store/store';
22
import { isNil } from 'es-toolkit';
33
import { bboxHeightChanged, bboxWidthChanged } from 'features/controlLayers/store/canvasSlice';
4-
import {
5-
buildSelectIsStagingBySessionId,
6-
selectActiveCanvasStagingAreaSessionId,
7-
} from 'features/controlLayers/store/canvasStagingAreaSlice';
4+
import { selectActiveCanvasIsStaging } from 'features/controlLayers/store/canvasStagingAreaSlice';
85
import {
96
heightChanged,
107
selectActiveTabParams,
@@ -120,9 +117,7 @@ export const addSetDefaultSettingsListener = (startAppListening: AppStartListeni
120117
}
121118
const setSizeOptions = { updateAspectRatio: true, clamp: true };
122119

123-
const sessionId = selectActiveCanvasStagingAreaSessionId(state);
124-
const selectIsStaging = buildSelectIsStagingBySessionId(sessionId);
125-
const isStaging = selectIsStaging(state);
120+
const isStaging = selectActiveCanvasIsStaging(state);
126121

127122
const activeTab = selectActiveTab(getState());
128123
if (activeTab === 'generate') {

invokeai/frontend/web/src/features/controlLayers/components/RefImage/RefImageImage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { objectEquals } from '@observ33r/object-equals';
44
import { skipToken } from '@reduxjs/toolkit/query';
55
import { useAppDispatch, useAppSelector, useAppStore } from 'app/store/storeHooks';
66
import { UploadImageIconButton } from 'common/hooks/useImageUploadButton';
7-
import { useCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
7+
import { useActiveCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
88
import { bboxSizeOptimized, bboxSizeRecalled } from 'features/controlLayers/store/canvasSlice';
99
import { sizeOptimized, sizeRecalled } from 'features/controlLayers/store/paramsSlice';
1010
import { selectActiveTab } from 'features/controlLayers/store/selectors';
@@ -42,7 +42,7 @@ export const RefImageImage = memo(
4242
const dispatch = useAppDispatch();
4343
const isConnected = useStore($isConnected);
4444
const tab = useAppSelector(selectActiveTab);
45-
const isStaging = useCanvasIsStaging();
45+
const isStaging = useActiveCanvasIsStaging();
4646
const imageWithDims = image?.crop?.image ?? image?.original.image ?? null;
4747
const croppedImageDTOReq = useGetImageDTOQuery(image?.crop?.image?.image_name ?? skipToken);
4848
const originalImageDTOReq = useGetImageDTOQuery(image?.original.image.image_name ?? skipToken);

invokeai/frontend/web/src/features/controlLayers/components/RegionalGuidance/RegionalGuidanceRefImageImage.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { useStore } from '@nanostores/react';
33
import { skipToken } from '@reduxjs/toolkit/query';
44
import { useAppDispatch, useAppSelector, useAppStore } from 'app/store/storeHooks';
55
import { UploadImageIconButton } from 'common/hooks/useImageUploadButton';
6-
import { useCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
6+
import { useActiveCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
77
import { bboxSizeOptimized, bboxSizeRecalled } from 'features/controlLayers/store/canvasSlice';
88
import { sizeOptimized, sizeRecalled } from 'features/controlLayers/store/paramsSlice';
99
import { selectActiveTab } from 'features/controlLayers/store/selectors';
@@ -32,7 +32,7 @@ export const RegionalGuidanceRefImageImage = memo(({ image, onChangeImage, dndTa
3232
const dispatch = useAppDispatch();
3333
const isConnected = useStore($isConnected);
3434
const tab = useAppSelector(selectActiveTab);
35-
const isStaging = useCanvasIsStaging();
35+
const isStaging = useActiveCanvasIsStaging();
3636
const { currentData: imageDTO, isError } = useGetImageDTOQuery(image?.image_name ?? skipToken);
3737
const handleResetControlImage = useCallback(() => {
3838
onChangeImage(null);

invokeai/frontend/web/src/features/controlLayers/components/StagingArea/context.tsx

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import {
66
} from 'features/controlLayers/store/canvasSettingsSlice';
77
import { rasterLayerAdded } from 'features/controlLayers/store/canvasSlice';
88
import {
9-
buildSelectCanvasQueueItemsBySessionId,
109
canvasQueueItemDiscarded,
1110
canvasSessionReset,
11+
selectActiveCanvasQueueItems,
1212
selectActiveCanvasStagingAreaSessionId,
1313
} from 'features/controlLayers/store/canvasStagingAreaSlice';
1414
import { selectBboxRect, selectSelectedEntityIdentifier } from 'features/controlLayers/store/selectors';
@@ -31,7 +31,6 @@ export const StagingAreaContextProvider = memo(({ children }: PropsWithChildren)
3131
const store = useAppStore();
3232
const socket = useStore($socket);
3333
const sessionId = useAppSelector(selectActiveCanvasStagingAreaSessionId);
34-
const selectQueueItems = useMemo(() => buildSelectCanvasQueueItemsBySessionId(sessionId), [sessionId]);
3534

3635
const stagingAreaAppApi = useMemo<StagingAreaAppApi>(() => {
3736
const _stagingAreaAppApi: StagingAreaAppApi = {
@@ -54,7 +53,7 @@ export const StagingAreaContextProvider = memo(({ children }: PropsWithChildren)
5453
onItemsChanged: (handler) => {
5554
let prev: S['SessionQueueItem'][] = [];
5655
return store.subscribe(() => {
57-
const next = selectQueueItems(store.getState());
56+
const next = selectActiveCanvasQueueItems(store.getState());
5857
if (prev !== next) {
5958
prev = next;
6059
handler(next);
@@ -99,7 +98,7 @@ export const StagingAreaContextProvider = memo(({ children }: PropsWithChildren)
9998
};
10099

101100
return _stagingAreaAppApi;
102-
}, [sessionId, selectQueueItems, socket, store]);
101+
}, [sessionId, socket, store]);
103102

104103
const [stagingAreaApi] = useState(() => new StagingAreaApi());
105104

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,6 @@
11
import { useAppSelector } from 'app/store/storeHooks';
2-
import {
3-
buildSelectIsStagingBySessionId,
4-
selectActiveCanvasStagingAreaSessionId,
5-
} from 'features/controlLayers/store/canvasStagingAreaSlice';
6-
import { useMemo } from 'react';
2+
import { selectActiveCanvasIsStaging } from 'features/controlLayers/store/canvasStagingAreaSlice';
73

8-
export const useCanvasIsStaging = () => {
9-
const sessionId = useAppSelector(selectActiveCanvasStagingAreaSessionId);
10-
const selectIsStagingBySessionIdSelector = useMemo(() => buildSelectIsStagingBySessionId(sessionId), [sessionId]);
11-
12-
return useAppSelector(selectIsStagingBySessionIdSelector);
4+
export const useActiveCanvasIsStaging = () => {
5+
return useAppSelector(selectActiveCanvasIsStaging);
136
};

invokeai/frontend/web/src/features/controlLayers/store/canvasStagingAreaSlice.ts

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -48,48 +48,45 @@ export const isCanvasStagingAreaStateAction = isAnyOf(...Object.values(canvasSta
4848

4949
export const { canvasSessionReset, canvasQueueItemDiscarded } = canvasStagingAreaState.actions;
5050

51-
const findCanvasStagingAreaByCanvasId = (state: RootState, canvasId: string) => {
51+
export const selectCanvasStagingAreaByCanvasId = (state: RootState, canvasId: string) => {
5252
const instance = state.canvas.canvases[canvasId];
5353
assert(instance, 'Canvas does not exist');
5454
return instance.staging;
5555
};
56-
export const selectCanvasStagingAreaByCanvasId = (state: RootState, canvasId: string) =>
57-
findCanvasStagingAreaByCanvasId(state, canvasId);
58-
const selectActiveCanvasStagingArea = (state: RootState) => {
59-
const canvasId = selectActiveCanvasId(state);
60-
return findCanvasStagingAreaByCanvasId(state, canvasId);
61-
};
6256
const selectCanvasStagingAreaBySessionId = (state: RootState, sessionId: string) => {
6357
const instance = Object.values(state.canvas.canvases).find((canvas) => canvas.staging.canvasSessionId === sessionId);
6458
assert(instance, 'Canvas does not exist');
6559
return instance.staging;
6660
};
67-
export const selectCanvasStagingAreaSessionId = (state: RootState, canvasId: string) => {
68-
const session = selectCanvasStagingAreaByCanvasId(state, canvasId);
69-
return session.canvasSessionId;
61+
const selectActiveCanvasStagingArea = (state: RootState) => {
62+
const canvasId = selectActiveCanvasId(state);
63+
return selectCanvasStagingAreaByCanvasId(state, canvasId);
7064
};
7165
export const selectActiveCanvasStagingAreaSessionId = (state: RootState) => {
7266
const session = selectActiveCanvasStagingArea(state);
7367
return session.canvasSessionId;
7468
};
75-
const selectCanvasStagingAreaDiscardedItemsBySessionId = (state: RootState, sessionId: string) => {
76-
const session = selectCanvasStagingAreaBySessionId(state, sessionId);
77-
return session.canvasDiscardedQueueItems;
78-
};
79-
export const buildSelectCanvasQueueItemsBySessionId = (sessionId: string) =>
80-
createSelector(
81-
queueApi.endpoints.listAllQueueItems.select({ destination: sessionId }),
82-
(state: RootState) => selectCanvasStagingAreaDiscardedItemsBySessionId(state, sessionId),
83-
({ data }, discardedItems) => {
84-
if (!data) {
85-
return EMPTY_ARRAY;
86-
}
87-
return data.filter(
88-
({ status, item_id }) => status !== 'canceled' && status !== 'failed' && !discardedItems?.includes(item_id)
89-
);
69+
const selectCanvasQueueItemsBySessionId = createSelector(
70+
(state: RootState, sessionId: string) =>
71+
queueApi.endpoints.listAllQueueItems.select({ destination: sessionId })(state),
72+
(state: RootState, sessionId: string) => selectCanvasStagingAreaBySessionId(state, sessionId),
73+
({ data }, session) => {
74+
if (!data) {
75+
return EMPTY_ARRAY;
9076
}
91-
);
92-
export const buildSelectIsStagingBySessionId = (sessionId: string) =>
93-
createSelector(buildSelectCanvasQueueItemsBySessionId(sessionId), (queueItems) => {
94-
return queueItems.length > 0;
95-
});
77+
return data.filter(
78+
({ status, item_id }) =>
79+
status !== 'canceled' && status !== 'failed' && !session.canvasDiscardedQueueItems?.includes(item_id)
80+
);
81+
}
82+
);
83+
export const selectActiveCanvasQueueItems = (state: RootState) => {
84+
const session = selectActiveCanvasStagingArea(state);
85+
86+
return selectCanvasQueueItemsBySessionId(state, session.canvasSessionId);
87+
};
88+
export const selectActiveCanvasIsStaging = (state: RootState) => {
89+
const queueItems = selectActiveCanvasQueueItems(state);
90+
91+
return queueItems.length > 0;
92+
};

invokeai/frontend/web/src/features/gallery/hooks/useEditImage.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { useAppStore } from 'app/store/storeHooks';
22
import { useCanvasManagerSafe } from 'features/controlLayers/contexts/CanvasManagerProviderGate';
3-
import { useCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
3+
import { useActiveCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
44
import { newCanvasFromImage } from 'features/imageActions/actions';
55
import { toast } from 'features/toast/toast';
66
import { navigationApi } from 'features/ui/layouts/navigation-api';
@@ -14,7 +14,7 @@ export const useEditImage = (imageDTO?: ImageDTO | null) => {
1414

1515
const { getState, dispatch } = useAppStore();
1616
const canvasManager = useCanvasManagerSafe();
17-
const isStaging = useCanvasIsStaging();
17+
const isStaging = useActiveCanvasIsStaging();
1818

1919
const isEnabled = useMemo(() => {
2020
if (!imageDTO) {

invokeai/frontend/web/src/features/gallery/hooks/useRecallAllImageMetadata.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useAppSelector, useAppStore } from 'app/store/storeHooks';
2-
import { useCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
2+
import { useActiveCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
33
import { selectActiveTab } from 'features/controlLayers/store/selectors';
44
import { ImageMetadataHandlers, MetadataUtils } from 'features/metadata/parsing';
55
import { useCallback, useMemo } from 'react';
@@ -12,7 +12,7 @@ export const useRecallAll = (imageDTO: ImageDTO) => {
1212
const store = useAppStore();
1313
const tab = useAppSelector(selectActiveTab);
1414
const { metadata, isLoading } = useDebouncedMetadata(imageDTO.image_name);
15-
const isStaging = useCanvasIsStaging();
15+
const isStaging = useActiveCanvasIsStaging();
1616
const clearStylePreset = useClearStylePresetWithToast();
1717

1818
const isEnabled = useMemo(() => {

invokeai/frontend/web/src/features/gallery/hooks/useRecallDimensions.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { useAppSelector, useAppStore } from 'app/store/storeHooks';
2-
import { useCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
2+
import { useActiveCanvasIsStaging } from 'features/controlLayers/hooks/useCanvasIsStaging';
33
import { selectActiveTab } from 'features/controlLayers/store/selectors';
44
import { MetadataUtils } from 'features/metadata/parsing';
55
import { useCallback, useMemo } from 'react';
@@ -8,7 +8,7 @@ import type { ImageDTO } from 'services/api/types';
88
export const useRecallDimensions = (imageDTO: ImageDTO) => {
99
const store = useAppStore();
1010
const tab = useAppSelector(selectActiveTab);
11-
const isStaging = useCanvasIsStaging();
11+
const isStaging = useActiveCanvasIsStaging();
1212

1313
const isEnabled = useMemo(() => {
1414
if (tab !== 'canvas' && tab !== 'generate') {

0 commit comments

Comments
 (0)