From fa338ddb6a43f03dca6cd2de4e930ac30baa44fb Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Mon, 5 Jun 2023 22:10:21 +1000 Subject: [PATCH] feat(ui): add useGetIsImageInUse Checks if an image is currently being used eg in canvas, nodes, controlnet, init image. --- .../src/common/hooks/useGetIsImageInUse.ts | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 invokeai/frontend/web/src/common/hooks/useGetIsImageInUse.ts diff --git a/invokeai/frontend/web/src/common/hooks/useGetIsImageInUse.ts b/invokeai/frontend/web/src/common/hooks/useGetIsImageInUse.ts new file mode 100644 index 0000000000..ad14941d16 --- /dev/null +++ b/invokeai/frontend/web/src/common/hooks/useGetIsImageInUse.ts @@ -0,0 +1,54 @@ +import { createSelector } from '@reduxjs/toolkit'; +import { useAppSelector } from 'app/store/storeHooks'; +import { defaultSelectorOptions } from 'app/store/util/defaultMemoizeOptions'; +import { canvasSelector } from 'features/canvas/store/canvasSelectors'; +import { controlNetSelector } from 'features/controlNet/store/controlNetSlice'; +import { nodesSelecter } from 'features/nodes/store/nodesSlice'; +import { generationSelector } from 'features/parameters/store/generationSelectors'; +import { some } from 'lodash-es'; + +const selectIsImageInUse = createSelector( + [ + generationSelector, + canvasSelector, + nodesSelecter, + controlNetSelector, + (state, image_name) => image_name, + ], + (generation, canvas, nodes, controlNet, image_name) => { + const isInitialImage = generation.initialImage?.image_name === image_name; + + const isCanvasImage = canvas.layerState.objects.some( + (obj) => obj.kind === 'image' && obj.image.image_name === image_name + ); + + const isNodesImage = nodes.nodes.some((node) => { + return some( + node.data.inputs, + (input) => + input.type === 'image' && input.value?.image_name === image_name + ); + }); + + const isControlNetImage = some( + controlNet.controlNets, + (c) => + c.controlImage?.image_name === image_name || + c.processedControlImage?.image_name === image_name + ); + + return { + isInitialImage, + isCanvasImage, + isNodesImage, + isControlNetImage, + }; + }, + defaultSelectorOptions +); + +export const useGetIsImageInUse = (image_name?: string) => { + const a = useAppSelector((state) => selectIsImageInUse(state, image_name)); + + return a; +};