'use client' import { useParams } from 'common' import { Auth } from 'icons' import { Loader2 } from 'lucide-react' import { useMemo } from 'react' import { EmptyState, ResultsList, SkeletonResults, type SearchResult, } from './ContextSearchResults.shared' import { useDatabasePoliciesQuery } from '@/data/database-policies/database-policies-query' import { useSelectedProjectQuery } from '@/hooks/misc/useSelectedProject' interface PolicySearchResultsProps { query: string } export function PolicySearchResults({ query }: PolicySearchResultsProps) { const { ref: projectRef } = useParams() const { data: project } = useSelectedProjectQuery() const trimmedQuery = query.trim() const { data: policies, isLoading: isLoadingPolicies, isError: isErrorPolicies, } = useDatabasePoliciesQuery( { projectRef: project?.ref, connectionString: project?.connectionString, }, { enabled: !!project?.ref, } ) const policyResults: SearchResult[] = useMemo(() => { if (!policies) return [] const filtered = trimmedQuery ? policies.filter((policy) => { const searchLower = trimmedQuery.toLowerCase() const policyName = policy.name?.toLowerCase() || '' const tableName = policy.table?.toLowerCase() || '' const schemaName = policy.schema?.toLowerCase() || '' const fullTableName = `${schemaName}.${tableName}` const command = policy.command?.toLowerCase() || '' return ( policyName.includes(searchLower) || tableName.includes(searchLower) || schemaName.includes(searchLower) || fullTableName.includes(searchLower) || command.includes(searchLower) ) }) : policies // Limit results for performance return filtered.slice(0, 20).map((policy) => { const displayName = policy.name || 'Untitled Policy' const tableDisplay = policy.schema && policy.schema !== 'public' ? `${policy.schema}.${policy.table}` : policy.table || 'unknown table' const commandDisplay = policy.command || 'ALL' const description = `${commandDisplay} on ${tableDisplay}` return { id: String(policy.id), name: displayName, description, } }) }, [policies, trimmedQuery]) const totalPolicies = policies?.length ?? 0 const renderFooter = () => (
{isLoadingPolicies ? ( Loading... ) : ( Total: {totalPolicies.toLocaleString()} polic{totalPolicies !== 1 ? 'ies' : 'y'} )}
) if (isLoadingPolicies) { return (
{renderFooter()}
) } if (isErrorPolicies) { return (

Failed to load policies

{renderFooter()}
) } if (policyResults.length === 0) { return (
{renderFooter()}
) } return (
{ const policy = policies?.find((p) => String(p.id) === result.id) if (!policy || !projectRef) return `/project/${projectRef}/auth/policies` as `/${string}` const params = new URLSearchParams() params.set('edit', String(policy.id)) if (policy.schema) { params.set('schema', policy.schema) } return `/project/${projectRef}/auth/policies?${params.toString()}` as `/${string}` }} className="pb-9" />
{renderFooter()}
) }