import { useParams } from 'common' import { uniqBy } from 'lodash' import { Check, ChevronsUpDown, Plus } from 'lucide-react' import Link from 'next/link' import { useRouter } from 'next/router' import { useState } from 'react' import { Alert_Shadcn_, AlertDescription_Shadcn_, AlertTitle_Shadcn_, Button, Command_Shadcn_, CommandEmpty_Shadcn_, CommandGroup_Shadcn_, CommandInput_Shadcn_, CommandItem_Shadcn_, CommandList_Shadcn_, CommandSeparator_Shadcn_, Popover_Shadcn_, PopoverContent_Shadcn_, PopoverTrigger_Shadcn_, ScrollArea, } from 'ui' import { DatabaseFunctionsData, useDatabaseFunctionsQuery, } from '@/data/database-functions/database-functions-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' type DatabaseFunction = DatabaseFunctionsData[number] interface FunctionSelectorProps { className?: string size?: 'tiny' | 'small' showError?: boolean schema?: string value: string onChange: (value: string) => void disabled?: boolean stopScrollPropagation?: boolean // used to filter the functions by a criteria filterFunction?: (func: DatabaseFunction) => boolean noResultsLabel?: React.ReactNode } const FunctionSelector = ({ className, size = 'tiny', showError = true, disabled = false, schema, value, onChange, stopScrollPropagation = false, filterFunction = () => true, noResultsLabel = No functions found in this schema., }: FunctionSelectorProps) => { const router = useRouter() const { ref } = useParams() const { data: project } = useSelectedProjectQuery() const [open, setOpen] = useState(false) const { data, error, isPending: isLoading, isError, isSuccess, refetch, } = useDatabaseFunctionsQuery({ projectRef: project?.ref, connectionString: project?.connectionString, }) const filteredFunctions = (data ?? []) .filter((func) => schema && func.schema === schema) .filter(filterFunction) const functions = uniqBy(filteredFunctions, (func) => func.name) return (
New function