import { Settings2 } from 'lucide-react'; import { useState, useEffect, useMemo } from 'react'; import { useRecoilValue, useRecoilState, useSetRecoilState } from 'recoil'; import { tPresetSchema } from 'librechat-data-provider'; import { PluginStoreDialog } from '~/components'; import { EndpointSettings, SaveAsPresetDialog, EndpointOptionsPopover, } from '~/components/Endpoints'; import { Button } from '~/components/ui'; import { cn, cardStyle } from '~/utils/'; import { useSetOptions } from '~/hooks'; import { ModelSelect } from './ModelSelect'; import { GenerationButtons } from './Generations'; import store from '~/store'; export default function OptionsBar() { const conversation = useRecoilValue(store.conversation); const messagesTree = useRecoilValue(store.messagesTree); const latestMessage = useRecoilValue(store.latestMessage); const setShowBingToneSetting = useSetRecoilState(store.showBingToneSetting); const [showPluginStoreDialog, setShowPluginStoreDialog] = useRecoilState( store.showPluginStoreDialog, ); const [saveAsDialogShow, setSaveAsDialogShow] = useState(false); const [showPopover, setShowPopover] = useRecoilState(store.showPopover); const [opacityClass, setOpacityClass] = useState('full-opacity'); const { setOption } = useSetOptions(); const { endpoint, conversationId, jailbreak } = conversation ?? {}; const altConditions: { [key: string]: boolean } = { bingAI: !!(latestMessage && conversation?.jailbreak && endpoint === 'bingAI'), }; const altSettings: { [key: string]: () => void } = { bingAI: () => setShowBingToneSetting((prev) => !prev), }; const noSettings = useMemo<{ [key: string]: boolean }>( () => ({ chatGPTBrowser: true, bingAI: jailbreak ? false : conversationId !== 'new', }), [jailbreak, conversationId], ); useEffect(() => { if (showPopover) { return; } else if (messagesTree && messagesTree.length >= 1) { setOpacityClass('show'); } else { setOpacityClass('full-opacity'); } }, [messagesTree, showPopover]); 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); return (
{ if (showPopover) { return; } setOpacityClass('full-opacity'); }} onMouseLeave={() => { if (showPopover) { return; } if (!messagesTree || messagesTree.length === 0) { return; } setOpacityClass('show'); }} onFocus={() => { if (showPopover) { return; } setOpacityClass('full-opacity'); }} onBlur={() => { if (showPopover) { return; } if (!messagesTree || messagesTree.length === 0) { return; } setOpacityClass('show'); }} > {!noSettings[endpoint] && ( )}
setShowPopover(false)} >
); }