import React, { useMemo } from 'react'; import { OGDialog, OGDialogTemplate } from '@librechat/client'; import { ImageUpIcon, FileSearch, TerminalSquareIcon, FileType2Icon } from 'lucide-react'; import { EToolResources, defaultAgentCapabilities } from 'librechat-data-provider'; import { useAgentToolPermissions, useAgentCapabilities, useGetAgentsConfig, useLocalize, } from '~/hooks'; import { useChatContext } from '~/Providers'; interface DragDropModalProps { onOptionSelect: (option: EToolResources | undefined) => void; files: File[]; isVisible: boolean; setShowModal: (showModal: boolean) => void; } interface FileOption { label: string; value?: EToolResources; icon: React.JSX.Element; condition?: boolean; } const DragDropModal = ({ onOptionSelect, setShowModal, files, isVisible }: DragDropModalProps) => { const localize = useLocalize(); const { agentsConfig } = useGetAgentsConfig(); /** TODO: Ephemeral Agent Capabilities * Allow defining agent capabilities on a per-endpoint basis * Use definition for agents endpoint for ephemeral agents * */ const capabilities = useAgentCapabilities(agentsConfig?.capabilities ?? defaultAgentCapabilities); const { conversation } = useChatContext(); const { fileSearchAllowedByAgent, codeAllowedByAgent } = useAgentToolPermissions( conversation?.agent_id, ); const options = useMemo(() => { const _options: FileOption[] = [ { label: localize('com_ui_upload_image_input'), value: undefined, icon: , condition: files.every((file) => file.type?.startsWith('image/')), }, ]; if (capabilities.fileSearchEnabled && fileSearchAllowedByAgent) { _options.push({ label: localize('com_ui_upload_file_search'), value: EToolResources.file_search, icon: , }); } if (capabilities.codeEnabled && codeAllowedByAgent) { _options.push({ label: localize('com_ui_upload_code_files'), value: EToolResources.execute_code, icon: , }); } if (capabilities.ocrEnabled) { _options.push({ label: localize('com_ui_upload_ocr_text'), value: EToolResources.ocr, icon: , }); } return _options; }, [capabilities, files, localize, fileSearchAllowedByAgent, codeAllowedByAgent]); if (!isVisible) { return null; } return ( {options.map( (option, index) => option.condition !== false && ( ), )} } /> ); }; export default DragDropModal;