/* eslint-disable react-hooks/exhaustive-deps */ import { Trash2 } from 'lucide-react'; import { useState, useEffect } from 'react'; import { useRecoilValue, useRecoilState } from 'recoil'; import { useDeletePresetMutation, useCreatePresetMutation } from 'librechat-data-provider'; import { Icon, EditPresetDialog } from '~/components/Endpoints'; import EndpointItems from './EndpointItems'; import PresetItems from './PresetItems'; import FileUpload from './FileUpload'; import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuSeparator, DropdownMenuTrigger, Dialog, DialogTrigger, TooltipProvider, Tooltip, TooltipTrigger, TooltipContent, } from '~/components/ui/'; import DialogTemplate from '~/components/ui/DialogTemplate'; import { cn, cleanupPreset } from '~/utils'; import { useLocalize, useLocalStorage, useConversation, useDefaultConvo } from '~/hooks'; import store from '~/store'; export default function NewConversationMenu() { const localize = useLocalize(); const getDefaultConversation = useDefaultConvo(); const [menuOpen, setMenuOpen] = useState(false); const [showPresets, setShowPresets] = useState(true); const [showEndpoints, setShowEndpoints] = useState(true); const [presetModelVisible, setPresetModelVisible] = useState(false); const [preset, setPreset] = useState(false); const [conversation, setConversation] = useRecoilState(store.conversation) ?? {}; const [messages, setMessages] = useRecoilState(store.messages); const availableEndpoints = useRecoilValue(store.availableEndpoints); const [presets, setPresets] = useRecoilState(store.presets); const modularEndpoints = new Set(['gptPlugins', 'anthropic', 'google', 'openAI']); const { endpoint } = conversation; const { newConversation } = useConversation(); const deletePresetsMutation = useDeletePresetMutation(); const createPresetMutation = useCreatePresetMutation(); const importPreset = (jsonData) => { createPresetMutation.mutate( { ...jsonData }, { onSuccess: (data) => { setPresets(data); }, onError: (error) => { console.error('Error uploading the preset:', error); }, }, ); }; const onFileSelected = (jsonData) => { const jsonPreset = { ...cleanupPreset({ preset: jsonData }), presetId: null }; importPreset(jsonPreset); }; // save states to localStorage const [newUser, setNewUser] = useLocalStorage('newUser', true); const [lastModel, setLastModel] = useLocalStorage('lastSelectedModel', {}); const setLastConvo = useLocalStorage('lastConversationSetup', {})[1]; const [lastBingSettings, setLastBingSettings] = useLocalStorage('lastBingSettings', {}); useEffect(() => { if (endpoint && endpoint !== 'bingAI') { const lastModelUpdate = { ...lastModel, [endpoint]: conversation?.model }; if (endpoint === 'gptPlugins') { lastModelUpdate.secondaryModel = conversation.agentOptions.model; } setLastModel(lastModelUpdate); } else if (endpoint === 'bingAI') { const { jailbreak, toneStyle } = conversation; setLastBingSettings({ ...lastBingSettings, jailbreak, toneStyle }); } setLastConvo(conversation); }, [conversation]); // set the current model const onSelectEndpoint = (newEndpoint) => { setMenuOpen(false); if (!newEndpoint) { return; } else { newConversation({}, { endpoint: newEndpoint }); } }; // set the current model const isModular = modularEndpoints.has(endpoint); const onSelectPreset = (newPreset) => { setMenuOpen(false); if (!newPreset) { return; } if ( isModular && modularEndpoints.has(newPreset?.endpoint) && endpoint === newPreset?.endpoint ) { const currentConvo = getDefaultConversation({ conversation, preset: newPreset, }); setConversation(currentConvo); setMessages(messages); return; } newConversation({}, newPreset); }; const onChangePreset = (preset) => { setPresetModelVisible(true); setPreset(preset); }; const clearAllPresets = () => { deletePresetsMutation.mutate({ arg: {} }); }; const onDeletePreset = (preset) => { deletePresetsMutation.mutate({ arg: preset }); }; const icon = Icon({ size: 32, ...conversation, error: false, button: true, }); const onOpenChange = (open) => { setMenuOpen(open); if (newUser) { setNewUser(false); } }; return ( {localize('com_endpoint_open_menu')} event.preventDefault()} side="top" > setShowEndpoints((prev) => !prev)} > {showEndpoints ? localize('com_endpoint_hide') : localize('com_endpoint_show')}{' '} {localize('com_endpoint')} {showEndpoints && (availableEndpoints.length ? ( ) : ( {localize('com_endpoint_not_available')} ))}
setShowPresets((prev) => !prev)} > {showPresets ? localize('com_endpoint_hide') : localize('com_endpoint_show')}{' '} {localize('com_endpoint_presets')} {showPresets && (presets.length ? ( ) : ( {localize('com_endpoint_no_presets')} ))}
); }