From c4d1e78f59e1d18e0ca068255d00e5b4e45e8fd3 Mon Sep 17 00:00:00 2001 From: psychedelicious <4822129+psychedelicious@users.noreply.github.com> Date: Thu, 22 May 2025 14:18:02 +1000 Subject: [PATCH] fix(ui): circular import issue --- .../components/CanvasMainPanelContent.tsx | 5 ++-- .../common/CanvasEntityHeaderWarnings.tsx | 2 +- .../controlLayers/hooks/addLayerHooks.ts | 2 +- .../controlLayers/hooks/saveCanvasHooks.ts | 2 +- .../controlLayers/store/paramsSlice.ts | 23 +++++++++++++++++ .../graph/generation/buildChatGPT4oGraph.ts | 2 +- .../util/graph/generation/buildFLUXGraph.ts | 2 +- .../graph/generation/buildImagen3Graph.ts | 2 +- .../util/graph/generation/buildSD1Graph.ts | 2 +- .../util/graph/generation/buildSD3Graph.ts | 2 +- .../util/graph/generation/buildSDXLGraph.ts | 2 +- .../web/src/features/queue/store/readiness.ts | 3 +-- .../web/src/services/api/endpoints/models.ts | 25 ++----------------- 13 files changed, 38 insertions(+), 36 deletions(-) diff --git a/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx b/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx index 4bc6262c41..18c9f54489 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/CanvasMainPanelContent.tsx @@ -26,7 +26,7 @@ import { CanvasToolbar } from 'features/controlLayers/components/Toolbar/CanvasT import { Transform } from 'features/controlLayers/components/Transform/Transform'; import { CanvasManagerProviderGate } from 'features/controlLayers/contexts/CanvasManagerProviderGate'; import { selectDynamicGrid, selectShowHUD } from 'features/controlLayers/store/canvasSettingsSlice'; -import { selectIsSessionStarted } from 'features/controlLayers/store/selectors'; +import { selectIsCanvasEmpty, selectIsSessionStarted } from 'features/controlLayers/store/selectors'; import { memo, useCallback } from 'react'; import { PiDotsThreeOutlineVerticalFill } from 'react-icons/pi'; @@ -51,8 +51,9 @@ MenuContent.displayName = 'MenuContent'; export const CanvasMainPanelContent = memo(() => { const isSessionStarted = useAppSelector(selectIsSessionStarted); + const isCanvasEmpty = useAppSelector(selectIsCanvasEmpty); - if (!isSessionStarted) { + if (!isSessionStarted && isCanvasEmpty) { return ; } diff --git a/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx b/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx index ea61e9e30a..b3f0e21972 100644 --- a/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx +++ b/invokeai/frontend/web/src/features/controlLayers/components/common/CanvasEntityHeaderWarnings.tsx @@ -18,7 +18,7 @@ import { upperFirst } from 'lodash-es'; import { memo, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { PiWarningBold } from 'react-icons/pi'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/controlLayers/hooks/addLayerHooks.ts b/invokeai/frontend/web/src/features/controlLayers/hooks/addLayerHooks.ts index 7415678b71..dfc4780d37 100644 --- a/invokeai/frontend/web/src/features/controlLayers/hooks/addLayerHooks.ts +++ b/invokeai/frontend/web/src/features/controlLayers/hooks/addLayerHooks.ts @@ -37,9 +37,9 @@ import { zModelIdentifierField } from 'features/nodes/types/common'; import { useCallback } from 'react'; import { modelConfigsAdapterSelectors, - selectMainModelConfig, selectModelConfigsQuery, } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from '../store/paramsSlice'; import type { ControlLoRAModelConfig, ControlNetModelConfig, diff --git a/invokeai/frontend/web/src/features/controlLayers/hooks/saveCanvasHooks.ts b/invokeai/frontend/web/src/features/controlLayers/hooks/saveCanvasHooks.ts index 06f4a0328e..5eb153cfc7 100644 --- a/invokeai/frontend/web/src/features/controlLayers/hooks/saveCanvasHooks.ts +++ b/invokeai/frontend/web/src/features/controlLayers/hooks/saveCanvasHooks.ts @@ -33,7 +33,7 @@ import { toast } from 'features/toast/toast'; import { useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { serializeError } from 'serialize-error'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from '../store/paramsSlice'; import type { ImageDTO } from 'services/api/types'; import type { JsonObject } from 'type-fest'; diff --git a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts index a6a7e8d98d..dabddf3c13 100644 --- a/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts +++ b/invokeai/frontend/web/src/features/controlLayers/store/paramsSlice.ts @@ -21,6 +21,8 @@ import type { ParameterVAEModel, } from 'features/parameters/types/parameterSchemas'; import { clamp } from 'lodash-es'; +import { modelConfigsAdapterSelectors, selectModelConfigsQuery } from 'services/api/endpoints/models'; +import { isNonRefinerMainModelConfig } from 'services/api/types'; import { newSessionRequested } from './actions'; @@ -336,3 +338,24 @@ export const selectRefinerNegativeAestheticScore = createParamsSelector( export const selectRefinerScheduler = createParamsSelector((params) => params.refinerScheduler); export const selectRefinerStart = createParamsSelector((params) => params.refinerStart); export const selectRefinerSteps = createParamsSelector((params) => params.refinerSteps); + +export const selectMainModelConfig = createSelector( + selectModelConfigsQuery, + selectParamsSlice, + (modelConfigs, { model }) => { + if (!modelConfigs.data) { + return null; + } + if (!model) { + return null; + } + const modelConfig = modelConfigsAdapterSelectors.selectById(modelConfigs.data, model.key); + if (!modelConfig) { + return null; + } + if (!isNonRefinerMainModelConfig(modelConfig)) { + return null; + } + return modelConfig; + } +); diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts index 0a93900d90..95f1a20cf3 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildChatGPT4oGraph.ts @@ -15,7 +15,7 @@ import { } from 'features/nodes/util/graph/graphBuilderUtils'; import { type GraphBuilderReturn, UnsupportedGenerationModeError } from 'features/nodes/util/graph/types'; import { t } from 'i18next'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts index 12379ced19..bff3803fb3 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildFLUXGraph.ts @@ -28,7 +28,7 @@ import { UnsupportedGenerationModeError, } from 'features/nodes/util/graph/types'; import { t } from 'i18next'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Invocation } from 'services/api/types'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts index 7f573bdecf..7be80eb788 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildImagen3Graph.ts @@ -14,7 +14,7 @@ import { } from 'features/nodes/util/graph/graphBuilderUtils'; import { type GraphBuilderReturn, UnsupportedGenerationModeError } from 'features/nodes/util/graph/types'; import { t } from 'i18next'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts index 8092c5ecd4..73875d57b8 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD1Graph.ts @@ -24,7 +24,7 @@ import { selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Invocation } from 'services/api/types'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts index 523ddb0e80..c0c864daaa 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSD3Graph.ts @@ -19,7 +19,7 @@ import { selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Invocation } from 'services/api/types'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts index ee00ce320b..f6c167770e 100644 --- a/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts +++ b/invokeai/frontend/web/src/features/nodes/util/graph/generation/buildSDXLGraph.ts @@ -24,7 +24,7 @@ import { selectPresetModifiedPrompts, } from 'features/nodes/util/graph/graphBuilderUtils'; import type { GraphBuilderReturn, ImageOutputNodes } from 'features/nodes/util/graph/types'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; +import { selectMainModelConfig } from 'features/controlLayers/store/paramsSlice'; import type { Invocation } from 'services/api/types'; import type { Equals } from 'tsafe'; import { assert } from 'tsafe'; diff --git a/invokeai/frontend/web/src/features/queue/store/readiness.ts b/invokeai/frontend/web/src/features/queue/store/readiness.ts index 849ed380e7..ebe96a21be 100644 --- a/invokeai/frontend/web/src/features/queue/store/readiness.ts +++ b/invokeai/frontend/web/src/features/queue/store/readiness.ts @@ -8,7 +8,7 @@ import { useAppSelector } from 'app/store/storeHooks'; import type { AppConfig } from 'app/types/invokeai'; import { useAssertSingleton } from 'common/hooks/useAssertSingleton'; import { useCanvasManagerSafe } from 'features/controlLayers/contexts/CanvasManagerProviderGate'; -import { selectParamsSlice } from 'features/controlLayers/store/paramsSlice'; +import { selectMainModelConfig,selectParamsSlice } from 'features/controlLayers/store/paramsSlice'; import { selectCanvasSlice } from 'features/controlLayers/store/selectors'; import type { CanvasState, ParamsState } from 'features/controlLayers/store/types'; import { @@ -42,7 +42,6 @@ import i18n from 'i18next'; import { debounce, groupBy, upperFirst } from 'lodash-es'; import { atom, computed } from 'nanostores'; import { useEffect } from 'react'; -import { selectMainModelConfig } from 'services/api/endpoints/models'; import type { MainModelConfig } from 'services/api/types'; import { $isConnected } from 'services/events/stores'; diff --git a/invokeai/frontend/web/src/services/api/endpoints/models.ts b/invokeai/frontend/web/src/services/api/endpoints/models.ts index aa78e8f739..405c794582 100644 --- a/invokeai/frontend/web/src/services/api/endpoints/models.ts +++ b/invokeai/frontend/web/src/services/api/endpoints/models.ts @@ -1,7 +1,6 @@ import type { EntityState } from '@reduxjs/toolkit'; -import { createEntityAdapter, createSelector } from '@reduxjs/toolkit'; +import { createEntityAdapter } from '@reduxjs/toolkit'; import { getSelectorsOptions } from 'app/store/createMemoizedSelector'; -import { selectParamsSlice } from 'features/controlLayers/store/paramsSlice'; import queryString from 'query-string'; import type { operations, paths } from 'services/api/schema'; import type { @@ -11,7 +10,6 @@ import type { SetHFTokenArg, SetHFTokenResponse, } from 'services/api/types'; -import { isNonRefinerMainModelConfig } from 'services/api/types'; import type { Param0 } from 'tsafe'; import type { ApiTagDescription } from '..'; @@ -326,23 +324,4 @@ export const { } = modelsApi; export const selectModelConfigsQuery = modelsApi.endpoints.getModelConfigs.select(); -export const selectMainModelConfig = createSelector( - selectModelConfigsQuery, - selectParamsSlice, - (modelConfigs, { model }) => { - if (!modelConfigs.data) { - return null; - } - if (!model) { - return null; - } - const modelConfig = modelConfigsAdapterSelectors.selectById(modelConfigs.data, model.key); - if (!modelConfig) { - return null; - } - if (!isNonRefinerMainModelConfig(modelConfig)) { - return null; - } - return modelConfig; - } -); +