import { Button } from "@/components/ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "@/components/ui/dropdown-menu" import { Input } from "@/components/ui/input" import { ChatbotUIContext } from "@/context/context" import { Tables } from "@/supabase/types" import { IconBooks, IconChevronDown, IconCircleCheckFilled } from "@tabler/icons-react" import { FileIcon } from "lucide-react" import { FC, useContext, useEffect, useRef, useState } from "react" interface AssistantRetrievalSelectProps { selectedAssistantRetrievalItems: Tables<"files">[] | Tables<"collections">[] onAssistantRetrievalItemsSelect: ( item: Tables<"files"> | Tables<"collections"> ) => void } export const AssistantRetrievalSelect: FC = ({ selectedAssistantRetrievalItems, onAssistantRetrievalItemsSelect }) => { const { files, collections } = 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 handleItemSelect = (item: Tables<"files"> | Tables<"collections">) => { onAssistantRetrievalItemsSelect(item) } if (!files || !collections) return null return ( { setIsOpen(isOpen) setSearch("") }} > setSearch(e.target.value)} onKeyDown={e => e.stopPropagation()} /> {selectedAssistantRetrievalItems .filter(item => item.name.toLowerCase().includes(search.toLowerCase()) ) .map(item => ( | Tables<"collections">} selected={selectedAssistantRetrievalItems.some( selectedAssistantRetrieval => selectedAssistantRetrieval.id === item.id )} onSelect={handleItemSelect} /> ))} {files .filter( file => !selectedAssistantRetrievalItems.some( selectedAssistantRetrieval => selectedAssistantRetrieval.id === file.id ) && file.name.toLowerCase().includes(search.toLowerCase()) ) .map(file => ( selectedAssistantRetrieval.id === file.id )} onSelect={handleItemSelect} /> ))} {collections .filter( collection => !selectedAssistantRetrievalItems.some( selectedAssistantRetrieval => selectedAssistantRetrieval.id === collection.id ) && collection.name.toLowerCase().includes(search.toLowerCase()) ) .map(collection => ( selectedAssistantRetrieval.id === collection.id )} onSelect={handleItemSelect} /> ))} ) } interface AssistantRetrievalOptionItemProps { contentType: "files" | "collections" item: Tables<"files"> | Tables<"collections"> selected: boolean onSelect: (item: Tables<"files"> | Tables<"collections">) => void } const AssistantRetrievalItemOption: FC = ({ contentType, item, selected, onSelect }) => { const handleSelect = () => { onSelect(item) } return (
{contentType === "files" ? (
).type} size={24} />
) : (
)}
{item.name}
{selected && ( )}
) }