import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { FileIcon } from "@/components/ui/file-icon" import { Input } from "@/components/ui/input" import { ChatbotUIContext } from "@/context/context" import { CollectionFile } from "@/types" import { IconChevronDown, IconCircleCheckFilled } from "@tabler/icons-react" import { FC, useContext, useEffect, useRef, useState } from "react" interface CollectionFileSelectProps { selectedCollectionFiles: CollectionFile[] onCollectionFileSelect: (file: CollectionFile) => void } export const CollectionFileSelect: FC = ({ selectedCollectionFiles, onCollectionFileSelect }) => { const { files } = useContext(ChatbotUIContext) const inputRef = useRef(null) const triggerRef = useRef(null) const [isOpen, setIsOpen] = useState(false) const [search, setSearch] = useState("") useEffect(() => { if (isOpen) { setTimeout(() => { inputRef.current?.focus() }, 100) // FIX: hacky } }, [isOpen]) const handleFileSelect = (file: CollectionFile) => { onCollectionFileSelect(file) } if (!files) return null return ( { setIsOpen(isOpen) setSearch("") }} > setSearch(e.target.value)} onKeyDown={e => e.stopPropagation()} /> {selectedCollectionFiles .filter(file => file.name.toLowerCase().includes(search.toLowerCase()) ) .map(file => ( selectedCollectionFile.id === file.id )} onSelect={handleFileSelect} /> ))} {files .filter( file => !selectedCollectionFiles.some( selectedCollectionFile => selectedCollectionFile.id === file.id ) && file.name.toLowerCase().includes(search.toLowerCase()) ) .map(file => ( selectedCollectionFile.id === file.id )} onSelect={handleFileSelect} /> ))} ) } interface CollectionFileItemProps { file: CollectionFile selected: boolean onSelect: (file: CollectionFile) => void } const CollectionFileItem: FC = ({ file, selected, onSelect }) => { const handleSelect = () => { onSelect(file) } return (
{file.name}
{selected && ( )}
) }