"use client"; import { ChatInput } from "@llamaindex/chat-ui"; import { FolderOpen, Check } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogTitle, DialogTrigger, DialogFooter, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Suspense, useState, useCallback } from "react"; import { useParams } from "next/navigation"; import { useDocuments, Document } from "@/hooks/use-documents"; import { DocumentsDataTable } from "@/components/chat_v2/DocumentsDataTable"; import { useSearchSourceConnectors } from "@/hooks/useSearchSourceConnectors"; import { getConnectorIcon, ConnectorButton as ConnectorButtonComponent, } from "@/components/chat/ConnectorComponents"; import { ResearchMode } from "@/components/chat"; import React from "react"; const DocumentSelector = React.memo( ({ onSelectionChange, selectedDocuments = [], }: { onSelectionChange?: (documents: Document[]) => void; selectedDocuments?: Document[]; }) => { const { search_space_id } = useParams(); const [isOpen, setIsOpen] = useState(false); const { documents, loading, isLoaded, fetchDocuments } = useDocuments( Number(search_space_id), true ); const handleOpenChange = useCallback( (open: boolean) => { setIsOpen(open); if (open && !isLoaded) { fetchDocuments(); } }, [fetchDocuments, isLoaded] ); const handleSelectionChange = useCallback( (documents: Document[]) => { onSelectionChange?.(documents); }, [onSelectionChange] ); const handleDone = useCallback(() => { setIsOpen(false); }, [selectedDocuments]); const selectedCount = selectedDocuments.length; return (
Select Documents Choose documents to include in your research context
{loading ? (

Loading documents...

) : isLoaded ? ( ) : null}
); } ); const ConnectorSelector = React.memo( ({ onSelectionChange, selectedConnectors = [], }: { onSelectionChange?: (connectorTypes: string[]) => void; selectedConnectors?: string[]; }) => { const [isOpen, setIsOpen] = useState(false); const { connectorSourceItems, isLoading, isLoaded, fetchConnectors } = useSearchSourceConnectors(); const handleOpenChange = useCallback( (open: boolean) => { setIsOpen(open); if (open && !isLoaded) { fetchConnectors(); } }, [fetchConnectors, isLoaded] ); const handleConnectorToggle = useCallback( (connectorType: string) => { const isSelected = selectedConnectors.includes(connectorType); const newSelection = isSelected ? selectedConnectors.filter( (type) => type !== connectorType ) : [...selectedConnectors, connectorType]; onSelectionChange?.(newSelection); }, [selectedConnectors, onSelectionChange] ); const handleSelectAll = useCallback(() => { onSelectionChange?.(connectorSourceItems.map((c) => c.type)); }, [connectorSourceItems, onSelectionChange]); const handleClearAll = useCallback(() => { onSelectionChange?.([]); }, [onSelectionChange]); return ( setIsOpen(true)} connectorSources={connectorSourceItems} /> Select Connectors Choose which data sources to include in your research {/* Connector selection grid */}
{isLoading ? (
) : ( connectorSourceItems.map((connector) => { const isSelected = selectedConnectors.includes( connector.type ); return (
handleConnectorToggle( connector.type ) } role="checkbox" aria-checked={isSelected} tabIndex={0} >
{getConnectorIcon(connector.type)}
{connector.name} {isSelected && ( )}
); }) )}
); } ); const SearchModeSelector = ({ searchMode, onSearchModeChange, }: { searchMode?: "DOCUMENTS" | "CHUNKS"; onSearchModeChange?: (mode: "DOCUMENTS" | "CHUNKS") => void; }) => { return (
Scope:
); }; const ResearchModeSelector = ({ researchMode, onResearchModeChange, }: { researchMode?: ResearchMode; onResearchModeChange?: (mode: ResearchMode) => void; }) => { return (
Mode:
); }; const CustomChatInputOptions = ({ onDocumentSelectionChange, selectedDocuments, onConnectorSelectionChange, selectedConnectors, searchMode, onSearchModeChange, researchMode, onResearchModeChange, }: { onDocumentSelectionChange?: (documents: Document[]) => void; selectedDocuments?: Document[]; onConnectorSelectionChange?: (connectorTypes: string[]) => void; selectedConnectors?: string[]; searchMode?: "DOCUMENTS" | "CHUNKS"; onSearchModeChange?: (mode: "DOCUMENTS" | "CHUNKS") => void; researchMode?: ResearchMode; onResearchModeChange?: (mode: ResearchMode) => void; }) => { return (
Loading...
}> Loading...}> ); }; export const CustomChatInput = ({ onDocumentSelectionChange, selectedDocuments, onConnectorSelectionChange, selectedConnectors, searchMode, onSearchModeChange, researchMode, onResearchModeChange, }: { onDocumentSelectionChange?: (documents: Document[]) => void; selectedDocuments?: Document[]; onConnectorSelectionChange?: (connectorTypes: string[]) => void; selectedConnectors?: string[]; searchMode?: "DOCUMENTS" | "CHUNKS"; onSearchModeChange?: (mode: "DOCUMENTS" | "CHUNKS") => void; researchMode?: ResearchMode; onResearchModeChange?: (mode: ResearchMode) => void; }) => { return ( ); };