import type { FC } from 'react'; import { useState } from 'react'; import { useRecoilState } from 'recoil'; import { BookCopy } from 'lucide-react'; import { modularEndpoints, useDeletePresetMutation, useCreatePresetMutation, } from 'librechat-data-provider'; import type { TPreset } from 'librechat-data-provider'; import { Content, Portal, Root, Trigger } from '@radix-ui/react-popover'; import { useLocalize, useDefaultConvo, useNavigateToConvo } from '~/hooks'; import { EditPresetDialog, PresetItems } from './Presets'; import { cleanupPreset, cn } from '~/utils'; import { useChatContext } from '~/Providers'; import store from '~/store'; const PresetsMenu: FC = () => { const localize = useLocalize(); const { conversation, newConversation, setPreset } = useChatContext(); const { navigateToConvo } = useNavigateToConvo(); const getDefaultConversation = useDefaultConvo(); const [presetModalVisible, setPresetModalVisible] = useState(false); // TODO: rely on react query for presets data const [presets, setPresets] = useRecoilState(store.presets); const deletePresetsMutation = useDeletePresetMutation(); const createPresetMutation = useCreatePresetMutation(); const { endpoint } = conversation ?? {}; const importPreset = (jsonPreset: TPreset) => { createPresetMutation.mutate( { ...jsonPreset }, { onSuccess: (data) => { setPresets(data); }, onError: (error) => { console.error('Error uploading the preset:', error); }, }, ); }; const onFileSelected = (jsonData: Record) => { const jsonPreset = { ...cleanupPreset({ preset: jsonData }), presetId: null }; importPreset(jsonPreset); }; const onSelectPreset = (newPreset: TPreset) => { if (!newPreset) { return; } if ( modularEndpoints.has(endpoint ?? '') && modularEndpoints.has(newPreset?.endpoint ?? '') && endpoint === newPreset?.endpoint ) { const currentConvo = getDefaultConversation({ conversation: conversation ?? {}, preset: newPreset, }); /* We don't reset the latest message, only when changing settings mid-converstion */ navigateToConvo(currentConvo, false); return; } console.log('preset', newPreset, endpoint); newConversation({ preset: newPreset }); }; const onChangePreset = (preset: TPreset) => { setPreset(preset); setPresetModalVisible(true); }; const clearAllPresets = () => { deletePresetsMutation.mutate({ arg: {} }); }; const onDeletePreset = (preset: TPreset) => { deletePresetsMutation.mutate({ arg: preset }); }; return (
); }; export default PresetsMenu;