import React, { useState, useEffect } from 'react'; 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 { useDeletePresetMutation, useCreatePresetMutation } from '~/data-provider'; import { Button } from '../../ui/Button.tsx'; import { DropdownMenu, DropdownMenuContent, DropdownMenuLabel, DropdownMenuRadioGroup, DropdownMenuSeparator, DropdownMenuTrigger } from '../../ui/DropdownMenu.tsx'; import { Dialog, DialogTrigger } from '../../ui/Dialog.tsx'; import DialogTemplate from '../../ui/DialogTemplate'; import store from '~/store'; export default function NewConversationMenu() { const [menuOpen, setMenuOpen] = useState(false); const [presetModelVisible, setPresetModelVisible] = useState(false); const [preset, setPreset] = useState(false); const availableEndpoints = useRecoilValue(store.availableEndpoints); const [presets, setPresets] = useRecoilState(store.presets); const conversation = useRecoilValue(store.conversation) || {}; 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); } } ); }; // 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 localstoreage useEffect(() => { if (endpoint) { const lastSelectedModel = JSON.parse(localStorage.getItem('lastSelectedModel')) || {}; localStorage.setItem('lastConversationSetup', JSON.stringify(conversation)); localStorage.setItem('lastSelectedModel', JSON.stringify({ ...lastSelectedModel, [endpoint] : conversation.model })); } }, [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 (!newPreset) return; else { 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()} > Select an Endpoint {availableEndpoints.length ? ( ) : ( No endpoint available. )}
Select a Preset
{presets.length ? ( ) : ( No preset yet. )}
); }