import clsx from 'clsx' import Link from 'next/link' import { useParams } from 'common/hooks' import { useProjectContext } from 'components/layouts/ProjectLayout/ProjectContext' import { FormSection, FormSectionContent, FormSectionLabel } from 'components/ui/Forms' import { useProjectApiQuery } from 'data/config/project-api-query' import { useEdgeFunctionsQuery } from 'data/edge-functions/edge-functions-query' import { uuidv4 } from 'lib/helpers' import { Button, DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, IconChevronDown, IconPlus, IconTrash, Input, Listbox, SidePanel, } from 'ui' import { HTTPArgument } from './EditHookPanel' interface HTTPRequestFieldsProps { type: 'http_request' | 'supabase_function' errors: any httpHeaders: HTTPArgument[] httpParameters: HTTPArgument[] onAddHeader: (header?: any) => void onUpdateHeader: (idx: number, property: string, value: string) => void onRemoveHeader: (idx: number) => void onAddParameter: () => void onUpdateParameter: (idx: number, property: string, value: string) => void onRemoveParameter: (idx: number) => void } const HTTPRequestFields = ({ type, errors, httpHeaders = [], httpParameters = [], onAddHeader, onUpdateHeader, onRemoveHeader, onAddParameter, onUpdateParameter, onRemoveParameter, }: HTTPRequestFieldsProps) => { const { project: selectedProject } = useProjectContext() const { ref } = useParams() const { data: settings } = useProjectApiQuery({ projectRef: ref }) const { data: functions } = useEdgeFunctionsQuery({ projectRef: ref }) const edgeFunctions = functions ?? [] const apiService = settings?.autoApiService const anonKey = apiService?.service_api_keys.find((x) => x.name === 'service_role key') ? apiService.serviceApiKey : '[YOUR API KEY]' return ( <> {type === 'http_request' ? 'HTTP Request' : type === 'supabase_function' ? 'Edge Function' : ''} } > GET POST {type === 'http_request' ? ( ) : type === 'supabase_function' && edgeFunctions.length === 0 ? (

Select which edge function to trigger

No edge functions created yet

{errors.http_url &&

{errors.http_url}

}
) : type === 'supabase_function' && edgeFunctions.length > 0 ? ( {edgeFunctions.map((fn) => { const restUrl = selectedProject?.restUrl const restUrlTld = restUrl ? new URL(restUrl).hostname.split('.').pop() : 'co' const functionUrl = `https://${ref}.supabase.${restUrlTld}/functions/v1/${fn.slug}` return ( {fn.name} ) })} ) : null} ms

} />
HTTP Headers} >
{httpHeaders.map((header, idx: number) => (
onUpdateHeader(idx, 'name', event.target.value)} /> onUpdateHeader(idx, 'value', event.target.value)} />
))}
{type === 'supabase_function' && ( onAddHeader({ id: uuidv4(), name: 'Authorization', value: `Bearer ${anonKey}`, }) } >

Add auth header with service key

Required if your edge function enforces JWT verification

onAddHeader({ id: uuidv4(), name: 'x-supabase-webhook-source', value: `[Use a secret value]`, }) } >

Add custom source header

Useful to verify that the edge function was triggered from this webhook

)}
HTTP Parameters} >
{httpParameters.map((parameter, idx: number) => (
onUpdateParameter(idx, 'name', event.target.value)} /> onUpdateParameter(idx, 'value', event.target.value)} />
))}
) } export default HTTPRequestFields