"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 ( ); } ); 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 ( ); } ); const SearchModeSelector = ({ searchMode, onSearchModeChange, }: { searchMode?: "DOCUMENTS" | "CHUNKS"; onSearchModeChange?: (mode: "DOCUMENTS" | "CHUNKS") => void; }) => { return (