"use client"; import { ChatInput } from "@llamaindex/chat-ui"; import { Brain, Check, FolderOpen, Zap } from "lucide-react"; import { useParams } from "next/navigation"; import React, { Suspense, useCallback, useState } from "react"; import { ConnectorButton as ConnectorButtonComponent } from "@/components/chat/ConnectorComponents"; import { DocumentsDataTable } from "@/components/chat/DocumentsDataTable"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogTitle, DialogTrigger, } from "@/components/ui/dialog"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { getConnectorIcon } from "@/contracts/enums/connectorIcons"; import type { Document } from "@/hooks/use-documents"; import { useLLMConfigs, useLLMPreferences } from "@/hooks/use-llm-configs"; import { useSearchSourceConnectors } from "@/hooks/use-search-source-connectors"; const DocumentSelector = React.memo( ({ onSelectionChange, selectedDocuments = [], }: { onSelectionChange?: (documents: Document[]) => void; selectedDocuments?: Document[]; }) => { const { search_space_id } = useParams(); const [isOpen, setIsOpen] = useState(false); const handleOpenChange = useCallback((open: boolean) => { setIsOpen(open); }, []); const handleSelectionChange = useCallback( (documents: Document[]) => { onSelectionChange?.(documents); }, [onSelectionChange] ); const handleDone = useCallback(() => { setIsOpen(false); }, []); const selectedCount = React.useMemo(() => selectedDocuments.length, [selectedDocuments.length]); return ( ); } ); DocumentSelector.displayName = "DocumentSelector"; const ConnectorSelector = React.memo( ({ onSelectionChange, selectedConnectors = [], }: { onSelectionChange?: (connectorTypes: string[]) => void; selectedConnectors?: string[]; }) => { const { search_space_id } = useParams(); const [isOpen, setIsOpen] = useState(false); const { connectorSourceItems, isLoading, isLoaded, fetchConnectors } = useSearchSourceConnectors(true, Number(search_space_id)); const handleOpenChange = useCallback( (open: boolean) => { setIsOpen(open); if (open && !isLoaded) { fetchConnectors(Number(search_space_id)); } }, [fetchConnectors, isLoaded, search_space_id] ); 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 ( ); } ); ConnectorSelector.displayName = "ConnectorSelector"; const SearchModeSelector = React.memo( ({ searchMode, onSearchModeChange, }: { searchMode?: "DOCUMENTS" | "CHUNKS"; onSearchModeChange?: (mode: "DOCUMENTS" | "CHUNKS") => void; }) => { const handleDocumentsClick = React.useCallback(() => { onSearchModeChange?.("DOCUMENTS"); }, [onSearchModeChange]); const handleChunksClick = React.useCallback(() => { onSearchModeChange?.("CHUNKS"); }, [onSearchModeChange]); return (