import { ChatbotUIContext } from "@/context/context" import { Tables } from "@/supabase/types" import { IconChevronDown, IconCircleCheckFilled } from "@tabler/icons-react" import { FC, useContext, useEffect, useRef, useState } from "react" import { Button } from "../ui/button" import { DropdownMenu, DropdownMenuContent, DropdownMenuTrigger } from "../ui/dropdown-menu" import { Input } from "../ui/input" import { toast } from "sonner" interface AssignWorkspaces { selectedWorkspaces: Tables<"workspaces">[] onSelectWorkspace: (workspace: Tables<"workspaces">) => void } export const AssignWorkspaces: FC = ({ selectedWorkspaces, onSelectWorkspace }) => { const { workspaces } = 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 handleWorkspaceSelect = (workspace: Tables<"workspaces">) => { onSelectWorkspace(workspace) } if (!workspaces) return null return ( { setIsOpen(isOpen) setSearch("") }} > setSearch(e.target.value)} onKeyDown={e => e.stopPropagation()} /> {selectedWorkspaces .filter(workspace => workspace.name.toLowerCase().includes(search.toLowerCase()) ) .map(workspace => ( selectedWorkspace.id === workspace.id )} onSelect={handleWorkspaceSelect} /> ))} {workspaces .filter( workspace => !selectedWorkspaces.some( selectedWorkspace => selectedWorkspace.id === workspace.id ) && workspace.name.toLowerCase().includes(search.toLowerCase()) ) .map(workspace => ( selectedWorkspace.id === workspace.id )} onSelect={handleWorkspaceSelect} /> ))} ) } interface WorkspaceItemProps { selectedWorkspaces: Tables<"workspaces">[] workspace: Tables<"workspaces"> selected: boolean onSelect: (workspace: Tables<"workspaces">) => void } const WorkspaceItem: FC = ({ selectedWorkspaces, workspace, selected, onSelect }) => { const handleSelect = () => { if (selected && selectedWorkspaces.length === 1) { toast.info("You must select at least one workspace") return } onSelect(workspace) } return (
{workspace.name}
{selected && ( )}
) }