/* eslint-disable react-hooks/exhaustive-deps */ import { useState, useEffect } from 'react'; import cleanupPreset from '~/utils/cleanupPreset.js'; import { useRecoilValue, useRecoilState } from 'recoil'; import EditPresetDialog from '../../Endpoints/EditPresetDialog'; import EndpointItems from './EndpointItems'; import PresetItems from './PresetItems'; import { Trash2 } from 'lucide-react'; import FileUpload from './FileUpload'; import getIcon from '~/utils/getIcon'; import getDefaultConversation from '~/utils/getDefaultConversation'; import { useDeletePresetMutation, useCreatePresetMutation } from '@librechat/data-provider'; import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuSeparator, DropdownMenuTrigger, DialogTemplate, Dialog, DialogTrigger, } from '../../ui/'; import { cn } from '~/utils/'; import store from '~/store'; export default function NewConversationMenu() { 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 endpointsConfig = useRecoilValue(store.endpointsConfig); const [presets, setPresets] = useRecoilState(store.presets); const modularEndpoints = new Set(['gptPlugins', 'anthropic', 'google', 'openAI']); const { endpoint, conversationId } = conversation; const { newConversation } = store.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, endpointsConfig }), presetId: null }; importPreset(jsonPreset); }; // update the default model when availableModels changes // typically, availableModels changes => modelsFilter or customGPTModels changes useEffect(() => { const isInvalidConversation = !availableEndpoints.find((e) => e === endpoint); if (conversationId == 'new' && isInvalidConversation) { newConversation(); } }, [availableEndpoints]); // save selected model to localStorage useEffect(() => { if (endpoint) { const lastSelectedModel = JSON.parse(localStorage.getItem('lastSelectedModel')) || {}; localStorage.setItem( 'lastSelectedModel', JSON.stringify({ ...lastSelectedModel, [endpoint]: conversation.model }), ); localStorage.setItem('lastConversationSetup', JSON.stringify(conversation)); } if (endpoint === 'bingAI') { const lastBingSettings = JSON.parse(localStorage.getItem('lastBingSettings')) || {}; const { jailbreak, toneStyle } = conversation; localStorage.setItem( 'lastBingSettings', JSON.stringify({ ...lastBingSettings, jailbreak, toneStyle }), ); } }, [conversation]); // set the current model const onSelectEndpoint = (newEndpoint) => { setMenuOpen(false); if (!newEndpoint) { return; } else { newConversation({}, { endpoint: newEndpoint }); } }; // set the current model const onSelectPreset = (newPreset) => { setMenuOpen(false); if (modularEndpoints.has(endpoint) && modularEndpoints.has(newPreset?.endpoint)) { const currentConvo = getDefaultConversation({ conversation, endpointsConfig, preset: newPreset, }); setConversation(currentConvo); setMessages(messages); return; } if (!newPreset) { return; } newConversation({}, newPreset); }; const onChangePreset = (preset) => { setPresetModelVisible(true); setPreset(preset); }; const clearAllPresets = () => { deletePresetsMutation.mutate({ arg: {} }); }; const onDeletePreset = (preset) => { deletePresetsMutation.mutate({ arg: preset }); }; const icon = getIcon({ size: 32, ...conversation, isCreatedByUser: false, error: false, button: true, }); return ( event.preventDefault()} > setShowEndpoints((prev) => !prev)} > {showEndpoints ? 'Hide ' : 'Show '} Endpoints {showEndpoints && (availableEndpoints.length ? ( ) : ( No endpoint available. ))}
setShowPresets((prev) => !prev)} > {showPresets ? 'Hide ' : 'Show '} Presets {showPresets && (presets.length ? ( ) : ( No preset yet. ))}
); }