import { useMemo, useState, useCallback } from 'react'; import type { DynamicSettingProps } from 'librechat-data-provider'; import { Label, HoverCard, HoverCardTrigger, ControlCombobox } from '@librechat/client'; import { TranslationKeys, useLocalize, useParameterEffects } from '~/hooks'; import { useChatContext } from '~/Providers'; import OptionHover from './OptionHover'; import { ESide } from '~/common'; import { cn } from '~/utils'; function DynamicCombobox({ label = '', settingKey, defaultValue, description = '', columnSpan, setOption, options: _options, items: _items, showLabel = true, showDefault = false, labelCode = false, descriptionCode = false, searchPlaceholderCode = false, selectPlaceholderCode = false, conversation, isCollapsed = false, SelectIcon = null, selectPlaceholder = '', searchPlaceholder = '', }: DynamicSettingProps & { isCollapsed?: boolean; SelectIcon?: React.ReactNode }) { const localize = useLocalize(); const { preset } = useChatContext(); const [inputValue, setInputValue] = useState(null); const selectedValue = useMemo(() => { return conversation?.[settingKey] ?? defaultValue; }, [conversation, defaultValue, settingKey]); const items = useMemo(() => { if (_items != null) { return _items; } return (_options ?? []).map((option) => ({ label: option, value: option, })); }, [_options, _items]); const handleChange = useCallback( (value: string) => { setInputValue(value); setOption(settingKey)(value); }, [setOption, settingKey], ); useParameterEffects({ preset, settingKey, defaultValue, conversation, inputValue, setInputValue, preventDelayedUpdate: true, }); const options = items ?? _options ?? []; if (options.length === 0) { return null; } return (
{showLabel === true && (
)}
{description && ( )}
); } export default DynamicCombobox;