import { Combobox, FormControl, Tooltip } from '@invoke-ai/ui-library'; import { useAppSelector } from 'app/store/storeHooks'; import { useGroupedModelCombobox } from 'common/hooks/useGroupedModelCombobox'; import { selectBase } from 'features/controlLayers/store/paramsSlice'; import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { useControlNetAndT2IAdapterModels } from 'services/api/hooks/modelsByType'; import type { AnyModelConfig, ControlNetModelConfig, T2IAdapterModelConfig } from 'services/api/types'; type Props = { modelKey: string | null; onChange: (modelConfig: ControlNetModelConfig | T2IAdapterModelConfig) => void; }; export const ControlLayerControlAdapterModel = memo(({ modelKey, onChange: onChangeModel }: Props) => { const { t } = useTranslation(); const currentBaseModel = useAppSelector(selectBase); const [modelConfigs, { isLoading }] = useControlNetAndT2IAdapterModels(); const selectedModel = useMemo(() => modelConfigs.find((m) => m.key === modelKey), [modelConfigs, modelKey]); const _onChange = useCallback( (modelConfig: ControlNetModelConfig | T2IAdapterModelConfig | null) => { if (!modelConfig) { return; } onChangeModel(modelConfig); }, [onChangeModel] ); const getIsDisabled = useCallback( (model: AnyModelConfig): boolean => { const isCompatible = currentBaseModel === model.base; const hasMainModel = Boolean(currentBaseModel); return !hasMainModel || !isCompatible; }, [currentBaseModel] ); const { options, value, onChange, noOptionsMessage } = useGroupedModelCombobox({ modelConfigs, onChange: _onChange, selectedModel, getIsDisabled, isLoading, groupByType: true, }); return ( ); }); ControlLayerControlAdapterModel.displayName = 'ControlLayerControlAdapterModel';