import type { PGPolicy } from '@supabase/pg-meta' import { Search } from 'lucide-react' import { useState } from 'react' import { Badge, cn, HoverCard, HoverCardContent, HoverCardTrigger, InputGroup, InputGroupAddon, InputGroupInput, } from 'ui' import { SimpleCodeBlock } from 'ui-patterns/SimpleCodeBlock' import { getGeneralPolicyTemplates, getQueuePolicyTemplates, getRealtimePolicyTemplates, } from '../PolicyEditorModal/PolicyEditorModal.constants' import { Markdown } from '@/components/interfaces/Markdown' import CardButton from '@/components/ui/CardButton' import CopyButton from '@/components/ui/CopyButton' import { NoSearchResults } from '@/components/ui/NoSearchResults' interface PolicyTemplatesProps { schema: string table: string selectedPolicy?: PGPolicy selectedTemplate?: string onSelectTemplate: (template: any) => void } export const PolicyTemplates = ({ schema, table, selectedPolicy, selectedTemplate, onSelectTemplate, }: PolicyTemplatesProps) => { const [search, setSearch] = useState('') const templates = schema === 'realtime' ? getRealtimePolicyTemplates() : schema === 'pgmq' ? getQueuePolicyTemplates() : getGeneralPolicyTemplates(schema, table.length > 0 ? table : 'table_name') const baseTemplates = selectedPolicy !== undefined ? templates.filter((t) => t.command === selectedPolicy.command) : templates const filteredTemplates = search.length > 0 ? baseTemplates.filter( (template) => template.name.toLowerCase().includes(search.toLowerCase()) || template.command.toLowerCase().includes(search.toLowerCase()) ) : baseTemplates return (
setSearch(e.target.value)} /> {search.length > 0 && filteredTemplates.length === 0 && ( )}
{filteredTemplates.map((template) => { return ( onSelectTemplate(template)} hideChevron fixedHeight={false} icon={
{template.command}
} >
{template.statement}
) })}
) }