'use client' import { useParams } from 'common' import { EdgeFunctions } from 'icons' import { Loader2 } from 'lucide-react' import { useMemo } from 'react' import { EmptyState, ResultsList, SkeletonResults, type SearchResult, } from './ContextSearchResults.shared' import { useEdgeFunctionsQuery } from '@/data/edge-functions/edge-functions-query' interface EdgeFunctionSearchResultsProps { query: string } export function EdgeFunctionSearchResults({ query }: EdgeFunctionSearchResultsProps) { const { ref: projectRef } = useParams() const trimmedQuery = query.trim() const { data: functions, isLoading: isLoadingFunctions, isError: isErrorFunctions, } = useEdgeFunctionsQuery( { projectRef, }, { enabled: !!projectRef, } ) const functionResults: SearchResult[] = useMemo(() => { if (!functions) return [] const filtered = trimmedQuery ? functions.filter((func) => { const searchLower = trimmedQuery.toLowerCase() const functionName = func.name?.toLowerCase() || '' const functionSlug = func.slug?.toLowerCase() || '' return functionName.includes(searchLower) || functionSlug.includes(searchLower) }) : functions // Limit results for performance return filtered.slice(0, 20).map((func) => { const displayName = func.name || func.slug || 'Untitled Function' const description = func.version ? `Version ${func.version}` : undefined return { id: String(func.id), name: displayName, description, } }) }, [functions, trimmedQuery]) const totalFunctions = functions?.length ?? 0 const renderFooter = () => (
{isLoadingFunctions ? ( Loading... ) : ( Total: {totalFunctions.toLocaleString()} function{totalFunctions !== 1 ? 's' : ''} )}
) if (isLoadingFunctions) { return (
{renderFooter()}
) } if (isErrorFunctions) { return (

Failed to load edge functions

{renderFooter()}
) } if (functionResults.length === 0) { return (
{renderFooter()}
) } return (
{ const func = functions?.find((f) => String(f.id) === result.id) if (!func || !projectRef) return `/project/${projectRef}/functions` as `/${string}` return `/project/${projectRef}/functions/${func.slug}` as `/${string}` }} className="pb-9" />
{renderFooter()}
) }