diff --git a/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/IPAdapterPanel.tsx b/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/IPAdapterPanel.tsx index b0a1fcc731..fa269fefdc 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/IPAdapterPanel.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/IPAdapterPanel.tsx @@ -5,8 +5,23 @@ import ParamIPAdapterFeatureToggle from './ParamIPAdapterFeatureToggle'; import ParamIPAdapterImage from './ParamIPAdapterImage'; import ParamIPAdapterModelSelect from './ParamIPAdapterModelSelect'; import ParamIPAdapterWeight from './ParamIPAdapterWeight'; +import { createSelector } from '@reduxjs/toolkit'; +import { stateSelector } from '../../../../app/store/store'; +import { defaultSelectorOptions } from '../../../../app/store/util/defaultMemoizeOptions'; +import { useAppSelector } from '../../../../app/store/storeHooks'; + +const selector = createSelector( + stateSelector, + (state) => { + const { isIPAdapterEnabled } = state.controlNet; + + return { isIPAdapterEnabled }; + }, + defaultSelectorOptions +); const IPAdapterPanel = () => { + const { isIPAdapterEnabled } = useAppSelector(selector); return ( <Flex sx={{ @@ -14,7 +29,6 @@ const IPAdapterPanel = () => { gap: 3, paddingInline: 3, paddingBlock: 2, - paddingBottom: 5, borderRadius: 'base', position: 'relative', bg: 'base.250', @@ -24,10 +38,26 @@ const IPAdapterPanel = () => { }} > <ParamIPAdapterFeatureToggle /> - <ParamIPAdapterImage /> - <ParamIPAdapterModelSelect /> - <ParamIPAdapterWeight /> - <ParamIPAdapterBeginEnd /> + {isIPAdapterEnabled && ( + <> + <ParamIPAdapterModelSelect /> + <Flex gap="3"> + <Flex + flexDirection="column" + sx={{ + h: 28, + w: 'full', + gap: 4, + mb: 4, + }} + > + <ParamIPAdapterWeight /> + <ParamIPAdapterBeginEnd /> + </Flex> + <ParamIPAdapterImage /> + </Flex> + </> + )} </Flex> ); }; diff --git a/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterImage.tsx b/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterImage.tsx index 9c5087d297..b8e3bdbae0 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterImage.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterImage.tsx @@ -66,7 +66,8 @@ const ParamIPAdapterImage = () => { layerStyle="second" sx={{ position: 'relative', - w: 'full', + h: 28, + w: 28, alignItems: 'center', justifyContent: 'center', aspectRatio: '1/1', diff --git a/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterModelSelect.tsx b/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterModelSelect.tsx index 8fb738d025..4cf2352f6a 100644 --- a/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterModelSelect.tsx +++ b/invokeai/frontend/web/src/features/controlNet/components/ipAdapter/ParamIPAdapterModelSelect.tsx @@ -6,7 +6,7 @@ import { ipAdapterModelChanged } from 'features/controlNet/store/controlNetSlice import { MODEL_TYPE_MAP } from 'features/parameters/types/constants'; import { modelIdToIPAdapterModelParam } from 'features/parameters/util/modelIdToIPAdapterModelParams'; import { forEach } from 'lodash-es'; -import { memo, useCallback, useMemo } from 'react'; +import { memo, useCallback, useEffect, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useGetIPAdapterModelsQuery } from 'services/api/endpoints/models'; @@ -24,6 +24,27 @@ const ParamIPAdapterModelSelect = () => { const { data: ipAdapterModels } = useGetIPAdapterModelsQuery(); + const firstModel = useMemo(() => { + if (!ipAdapterModels || !Object.keys(ipAdapterModels.entities).length) { + return undefined; + } + const firstModelId = Object.keys(ipAdapterModels.entities)[0]; + + if (!firstModelId) { + return undefined; + } + + const firstModel = ipAdapterModels.entities[firstModelId]; + + return firstModel ? firstModel : undefined; + }, [ipAdapterModels]); + + useEffect(() => { + if (firstModel) { + dispatch(ipAdapterModelChanged(firstModel)); + } + }, [firstModel, dispatch]); + // grab the full model entity from the RTK Query cache const selectedModel = useMemo( () =>