NEWONE1 / invokeai /frontend /web /src /features /controlLayers /components /ControlLayer /ControlLayerControlAdapterModel.tsx
| 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 ( | |
| <Tooltip label={selectedModel?.description}> | |
| <FormControl isInvalid={!value || currentBaseModel !== selectedModel?.base} w="full"> | |
| <Combobox | |
| options={options} | |
| placeholder={t('common.placeholderSelectAModel')} | |
| value={value} | |
| onChange={onChange} | |
| noOptionsMessage={noOptionsMessage} | |
| /> | |
| </FormControl> | |
| </Tooltip> | |
| ); | |
| }); | |
| ControlLayerControlAdapterModel.displayName = 'ControlLayerControlAdapterModel'; | |