import { memo, useMemo, useRef, useState } from 'react'; import { Folder } from 'lucide-react'; import * as Ariakit from '@ariakit/react'; import { EModelEndpoint, EToolResources } from 'librechat-data-provider'; import { HoverCard, DropdownPopup, AttachmentIcon, CircleHelpIcon, SharePointIcon, HoverCardPortal, HoverCardContent, HoverCardTrigger, } from '@librechat/client'; import type { ExtendedFile } from '~/common'; import { useSharePointFileHandlingNoChatContext } from '~/hooks/Files/useSharePointFileHandling'; import { useFileHandlingNoChatContext } from '~/hooks/Files/useFileHandling'; import { useAgentFileConfig, useLocalize, useLazyEffect } from '~/hooks'; import { SharePointPickerDialog } from '~/components/SharePoint'; import FileRow from '~/components/Chat/Input/Files/FileRow'; import { useGetStartupConfig } from '~/data-provider'; import { ESide, isEphemeralAgent } from '~/common'; function FileContext({ agent_id, files: _files, }: { agent_id: string; files?: [string, ExtendedFile][]; }) { const localize = useLocalize(); const fileInputRef = useRef(null); const [files, setFiles] = useState>(new Map()); const fileHandlingState = useMemo(() => ({ files, setFiles, conversation: null }), [files]); const [isPopoverActive, setIsPopoverActive] = useState(false); const [isSharePointDialogOpen, setIsSharePointDialogOpen] = useState(false); const { data: startupConfig } = useGetStartupConfig(); const sharePointEnabled = startupConfig?.sharePointFilePickerEnabled; const { endpointFileConfig, providerValue, endpointType } = useAgentFileConfig(); const endpointOverride = providerValue || EModelEndpoint.agents; const { handleFileChange } = useFileHandlingNoChatContext( { additionalMetadata: { agent_id, tool_resource: EToolResources.context }, endpointOverride, endpointTypeOverride: endpointType, fileSetter: setFiles, }, fileHandlingState, ); const { handleSharePointFiles, isProcessing, downloadProgress } = useSharePointFileHandlingNoChatContext( { additionalMetadata: { agent_id, tool_resource: EToolResources.file_search }, endpointOverride, endpointTypeOverride: endpointType, fileSetter: setFiles, }, fileHandlingState, ); useLazyEffect( () => { if (_files) { setFiles(new Map(_files)); } }, [_files], 750, ); const isUploadDisabled = endpointFileConfig?.disabled ?? false; const handleSharePointFilesSelected = async (sharePointFiles: any[]) => { try { await handleSharePointFiles(sharePointFiles); setIsSharePointDialogOpen(false); } catch (error) { console.error('SharePoint file processing error:', error); } }; if (isUploadDisabled) { return null; } const handleLocalFileClick = () => { // necessary to reset the input if (fileInputRef.current) { fileInputRef.current.value = ''; } fileInputRef.current?.click(); }; const dropdownItems = [ { label: localize('com_files_upload_local_machine'), onClick: handleLocalFileClick, icon: , }, { label: localize('com_files_upload_sharepoint'), onClick: () => setIsSharePointDialogOpen(true), icon: , }, ]; const menuTrigger = (
{localize('com_ui_upload_file_context')}
); return (

{localize('com_agents_file_context_description')}

{/* File Context Files */}
{children}
} />
{sharePointEnabled ? ( <> ) : ( )}
{/* Disabled Message */} {agent_id ? null : (
{localize('com_agents_file_context_disabled')}
)}
); } const MemoizedFileContext = memo(FileContext); MemoizedFileContext.displayName = 'FileContext'; export default MemoizedFileContext;