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 (
{isLoading && ( )} {showError && isError && ( Failed to load functions Error: {error.message} )} {isSuccess && ( event.stopPropagation() : undefined} > No functions found 7 ? 'h-[210px]' : ''}> {!functions.length && ( {noResultsLabel} )} {functions.map((func) => ( { onChange(func.name) setOpen(false) }} onClick={() => { onChange(func.name) setOpen(false) }} > {func.name} {value === func.name && ( )} ))} { setOpen(false) router.push(`/project/${ref}/database/functions`) }} onClick={() => setOpen(false)} > { setOpen(false) }} className="w-full flex items-center gap-2" >

New function

)}
) } export default FunctionSelector