import { useEffect } from 'react'; import { Search, X } from 'lucide-react'; import { Dialog, DialogPanel, DialogTitle, Description } from '@headlessui/react'; import { useFormContext } from 'react-hook-form'; import { isAgentsEndpoint } from 'librechat-data-provider'; import { useUpdateUserPluginsMutation } from 'librechat-data-provider/react-query'; import type { AssistantsEndpoint, EModelEndpoint, TPluginAction, TError, } from 'librechat-data-provider'; import type { TPluginStoreDialogProps } from '~/common/types'; import { PluginPagination, PluginAuthForm } from '~/components/Plugins/Store'; import { useLocalize, usePluginDialogHelpers } from '~/hooks'; import { useAvailableToolsQuery } from '~/data-provider'; import ToolItem from './ToolItem'; function ToolSelectDialog({ isOpen, endpoint, setIsOpen, toolsFormKey, }: TPluginStoreDialogProps & { toolsFormKey: string; endpoint: AssistantsEndpoint | EModelEndpoint.agents; }) { const localize = useLocalize(); const { getValues, setValue } = useFormContext(); const { data: tools } = useAvailableToolsQuery(endpoint); const isAgentTools = isAgentsEndpoint(endpoint); const { maxPage, setMaxPage, currentPage, setCurrentPage, itemsPerPage, searchChanged, setSearchChanged, searchValue, setSearchValue, gridRef, handleSearch, handleChangePage, error, setError, errorMessage, setErrorMessage, showPluginAuthForm, setShowPluginAuthForm, selectedPlugin, setSelectedPlugin, } = usePluginDialogHelpers(); const updateUserPlugins = useUpdateUserPluginsMutation(); const handleInstallError = (error: TError) => { setError(true); const errorMessage = error.response?.data?.message ?? ''; if (errorMessage) { setErrorMessage(errorMessage); } setTimeout(() => { setError(false); setErrorMessage(''); }, 5000); }; const handleInstall = (pluginAction: TPluginAction) => { const addFunction = () => { const fns = getValues(toolsFormKey).slice(); fns.push(pluginAction.pluginKey); setValue(toolsFormKey, fns); }; if (!pluginAction.auth) { return addFunction(); } updateUserPlugins.mutate(pluginAction, { onError: (error: unknown) => { handleInstallError(error as TError); }, onSuccess: addFunction, }); setShowPluginAuthForm(false); }; const onRemoveTool = (tool: string) => { setShowPluginAuthForm(false); updateUserPlugins.mutate( { pluginKey: tool, action: 'uninstall', auth: null, isEntityTool: true }, { onError: (error: unknown) => { handleInstallError(error as TError); }, onSuccess: () => { const fns = getValues(toolsFormKey).filter((fn: string) => fn !== tool); setValue(toolsFormKey, fns); }, }, ); }; const onAddTool = (pluginKey: string) => { setShowPluginAuthForm(false); const getAvailablePluginFromKey = tools?.find((p) => p.pluginKey === pluginKey); setSelectedPlugin(getAvailablePluginFromKey); const { authConfig, authenticated = false } = getAvailablePluginFromKey ?? {}; if (authConfig && authConfig.length > 0 && !authenticated) { setShowPluginAuthForm(true); } else { handleInstall({ pluginKey, action: 'install', auth: null }); } }; const filteredTools = tools?.filter((tool) => tool.name.toLowerCase().includes(searchValue.toLowerCase()), ); useEffect(() => { if (filteredTools) { setMaxPage(Math.ceil(filteredTools.length / itemsPerPage)); if (searchChanged) { setCurrentPage(1); setSearchChanged(false); } } }, [ tools, itemsPerPage, searchValue, filteredTools, searchChanged, setMaxPage, setCurrentPage, setSearchChanged, ]); return ( { setIsOpen(false); setCurrentPage(1); setSearchValue(''); }} className="relative z-[102]" > {/* The backdrop, rendered as a fixed sibling to the panel container */}
{/* Full-screen container to center the panel */}
{isAgentTools ? localize('com_nav_tool_dialog_agents') : localize('com_nav_tool_dialog')} {localize('com_nav_tool_dialog_description')}
{error && (
{localize('com_nav_plugin_auth_error')} {errorMessage}
)} {showPluginAuthForm && (
handleInstall(installActionData)} isEntityTool={true} />
)}
{filteredTools && filteredTools .slice((currentPage - 1) * itemsPerPage, currentPage * itemsPerPage) .map((tool, index) => ( onAddTool(tool.pluginKey)} onRemoveTool={() => onRemoveTool(tool.pluginKey)} /> ))}
{maxPage > 0 ? ( ) : (
)}
); } export default ToolSelectDialog;