import { useRecoilState } from 'recoil'; import { Settings2 } from 'lucide-react'; import { Root, Anchor } from '@radix-ui/react-popover'; import { useState, useEffect, useMemo } from 'react'; import { useGetEndpointsQuery } from 'librechat-data-provider/react-query'; import { tConvoUpdateSchema, EModelEndpoint, isParamEndpoint } from 'librechat-data-provider'; import type { TPreset, TInterfaceConfig } from 'librechat-data-provider'; import { EndpointSettings, SaveAsPresetDialog, AlternativeSettings } from '~/components/Endpoints'; import { PluginStoreDialog, TooltipAnchor } from '~/components'; import { ModelSelect } from '~/components/Input/ModelSelect'; import { useSetIndexOptions, useLocalize } from '~/hooks'; import OptionsPopover from './OptionsPopover'; import PopoverButtons from './PopoverButtons'; import { useChatContext } from '~/Providers'; import { getEndpointField } from '~/utils'; import store from '~/store'; export default function HeaderOptions({ interfaceConfig, }: { interfaceConfig?: Partial; }) { const { data: endpointsConfig } = useGetEndpointsQuery(); const [saveAsDialogShow, setSaveAsDialogShow] = useState(false); const [showPluginStoreDialog, setShowPluginStoreDialog] = useRecoilState( store.showPluginStoreDialog, ); const localize = useLocalize(); const { showPopover, conversation, latestMessage, setShowPopover, setShowBingToneSetting } = useChatContext(); const { setOption } = useSetIndexOptions(); const { endpoint, conversationId, jailbreak = false } = conversation ?? {}; const altConditions: { [key: string]: boolean } = { bingAI: !!(latestMessage && jailbreak && endpoint === 'bingAI'), }; const altSettings: { [key: string]: () => void } = { bingAI: () => setShowBingToneSetting((prev) => !prev), }; const noSettings = useMemo<{ [key: string]: boolean }>( () => ({ [EModelEndpoint.chatGPTBrowser]: true, [EModelEndpoint.bingAI]: jailbreak ? false : conversationId !== 'new', }), [jailbreak, conversationId], ); useEffect(() => { if (endpoint && noSettings[endpoint]) { setShowPopover(false); } // eslint-disable-next-line react-hooks/exhaustive-deps }, [endpoint, noSettings]); const saveAsPreset = () => { setSaveAsDialogShow(true); }; if (!endpoint) { return null; } const triggerAdvancedMode = altConditions[endpoint] ? altSettings[endpoint] : () => setShowPopover((prev) => !prev); const endpointType = getEndpointField(endpointsConfig, endpoint, 'type'); const paramEndpoint = isParamEndpoint(endpoint, endpointType); return (
{interfaceConfig?.modelSelect === true && ( )} {!noSettings[endpoint] && interfaceConfig?.parameters === true && paramEndpoint === false && ( )}
{interfaceConfig?.parameters === true && paramEndpoint === false && ( } closePopover={() => setShowPopover(false)} >
)} {interfaceConfig?.presets === true && ( )} {interfaceConfig?.parameters === true && ( )}
); }